代码之家  ›  专栏  ›  技术社区  ›  Steve Dunn supercat

在C#/VB中,如何确定方法是正常声明还是作为扩展方法声明?

  •  1
  • Steve Dunn supercat  · 技术社区  · 14 年前

    扩展方法对于您不拥有并且不能/不想从中派生和扩展的类型(例如引用类型和接口)很有用。

    对于类,尤其是您拥有的类,它们仍然很有用—但是我想知道如何确定什么应该是扩展方法,或者什么应该是类本身的方法。

    就我个人而言,每当我想到这件事,我总是带着以下想法绕圈子:

    • 它不是类的核心职责的一部分,它应该是一个扩展方法-但是如果它足够有用,它肯定应该是类的职责。。。

    你怎么认为?

    3 回复  |  直到 14 年前
        1
  •  3
  •   Matthew Abbott    14 年前

    public ISomething GetSomething(this ISomewhere somewhere) {  }
    

    这主要是因为您希望在接口上执行一些常见的操作,但是由于接口没有实现,所以我们不能。

    另一次,我将创建扩展方法,用于我不拥有的类型,但希望将一系列操作封装到单个方法中。

        2
  •  4
  •   Coding Flow    14 年前

    扩展方法对于扩展没有源代码的类非常有用,特别是如果您想扩展一组从特定基派生的类,但又不想创建自己的派生版本来添加新方法。当您要扩展实现一个或多个接口的某些类时,它们也很有用,但不能使它们都派生自基类。我真的不会用它们来做别的。

        3
  •  0
  •   Fadrian Sudaman    14 年前

    一个简单的例子:假设在基础域模型中,您可能有一个学生实体,它封装了所有的核心操作,如注册、参加、推迟等。假设项目中的一个子系统允许学生注册工作通知,并在发布新工作时通过电子邮件通知。像student.registerForJob和student.notifyJobPosting这样的行为并不是真正的核心功能。因此,尽管我拥有学生类代码的完全访问权限,但我不会将这些行为添加到学生核心实体中,因为它可能会打破您的设计边界或原则(例如open/closed或YAGNI),相反,仅在招聘子系统中为学生实体创建这些扩展方法更有意义。

    显然,通过继承对Student进行子分类也可以让您实现相同的功能,但是扩展方法显然提供了一种非常灵活的替代方法。从本质上讲,可拓方法是实现装饰设计模式应用的一种方法。更多地了解使用decorator设计模式的动机可能会进一步澄清这些疑问。