gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 05:28:06 24 4
gpt4 key购买 nike

.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/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com