.net - 随着扩展方法的出现,抽象类的吸引力是否降低了?

标签 .net extension-methods abstract-class

.NET 中扩展方法的一个有趣方面是您可以将它们应用于接口(interface)。对我来说,我可以在接口(interface)附近定义功能而不定义使程序集困惑的抽象类似乎很好。

我知道抽象类并没有过时或任何东西,但是您对在代码中使用这种副作用有何感想?

例子:

public static class IUserExtensions
{
    public static bool IsCurrentUser(this IUser user)
    {
        return (HttpContext.Current.User != null &&
                HttpContext.Current.User.Identity.Name == user.ID.ToString());
    }
}

public interface IUser {
    int ID { get; set; }
}

最佳答案

扩展方法可以让您专注于抽象类实际上应该做什么。在抽象类中实现“实用程序”代码是一种诱惑,因为即使它可能不是逻辑继承树的一部分,实现者也会使用它。扩展方法让您可以将这些实用方法附加到接口(interface),而不会弄乱抽象基类。

编辑

具体来说,我会应用这些准则。

遗产

  • 如果行为是基类的逻辑行为的一部分,请使用继承
  • 如果行为是横切的(适用于对象层次结构之外的事物),则不要使用继承。这些将需要复制。

  • 实用程序类
  • 如果行为在逻辑上不属于它所作用的类,请使用实用程序类(静态类)
  • 如果实用程序类修改了它所作用的对象的内部状态,则不要使用它们。状态修改应该只保留给对象实现层次结构。

  • 扩展方法
  • 当扩展方法产生较少摩擦时,请使用与实用程序类相同的决定。如果采用扩展方法感觉不太自然,请不要这样做。
  • 请使用扩展方法将实用程序添加到您无法控制的类(如字符串)。
  • 当行为被它所扩展的类使用时,不要使用扩展方法。虽然可以做到,但感觉做作
  • 不要仅仅因为可以就使用扩展方法。事实上,除非你必须这样做,否则不要偏离良好的老式 OOP。然而,当你不得不做的时候,扩展方法是一个相对无用且无害的决定。

  • 编辑 2

    想到另一个 DO 扩展方法

    请使用扩展方法为某些实现提供自然语言(内部 DSL)。这是一个愚蠢的例子。
    int age = getAge();
    if (age.IsDraftAge() && !age.IsLegalDrinkingAge())
    {
        Console.WriteLine(@"You cannot drink until your birthdate on {0}.
    Join the army instead.",
                          age.GetYearWhenGettingDrunkIsOk());
    }
    

    关于.net - 随着扩展方法的出现,抽象类的吸引力是否降低了?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/651884/

    相关文章:

    c# - 如何修改一个简单的字符串扩展来支持 SQL

    java - 方法重写中父类(super class)方法之前的抽象关键字

    c# - C# 中的虚拟/抽象字段

    c# - .net Cryptography - 有没有办法告诉某些东西被解密错误?

    c# - 相关实体未加载

    swift - 在 Swift 4 中,您能否编写仅适用于遵守多种协议(protocol)的事物的扩展?

    c# - 从扩展方法中获取原始变量名

    C++在尝试覆盖方法时无法实例化抽象类

    c# - 在 C# 中,如何按尾数对 double 列表进行排序?

    .net - 如何在 SQL Server 中以编程方式创建数据库?