C# 使用委托避免子类化

C# 使用委托避免子类化,c#,inheritance,delegates,C#,Inheritance,Delegates,我想听听你对使用委托而不是虚拟函数和子类的利弊的看法 这是我的看法 它不再是面向对象编程了。这是做事的老办法 嗯。这就是我所拥有的。这很大程度上取决于你真正的目标是面向对象还是函数式风格 面向对象=>方法的继承和重写 Functional=>将委托传递给方法 通常最好选择其中一种,但有时混用也无妨。我通常会坚持OO方法,因为这是C#的主要遗产 然而,在某些情况下,将lambda epxpressions传递给函数会删除大量样板代码。事实上,在极端情况下,创建接受委托/lambda表达式的方法

我想听听你对使用委托而不是虚拟函数和子类的利弊的看法

这是我的看法

  • 它不再是面向对象编程了。这是做事的老办法

  • 嗯。这就是我所拥有的。

    这很大程度上取决于你真正的目标是面向对象还是函数式风格

    • 面向对象=>方法的继承和重写
    • Functional=>将委托传递给方法
    通常最好选择其中一种,但有时混用也无妨。我通常会坚持OO方法,因为这是C#的主要遗产


    然而,在某些情况下,将lambda epxpressions传递给函数会删除大量样板代码。事实上,在极端情况下,创建接受委托/lambda表达式的方法的替代方法可能会重写基类十几次,只需稍作更改。这样说,如果您想要定制的行为是相当固定的,那么子类化通常是更好的选择。

    模糊的问题,因此您会得到一个模糊的答案:

    使用虚拟方法和子类化来表示模型。使用代理实现机制

    看看我对你的回答


    关于这方面的其他想法。

    我认为代表的问题是一个转移视线的问题:这实际上是关于的对比

    这是一个很好的建议,所以策略模式是更好的默认技术(无论您是使用对象还是委托来做脏活),主要是因为它提供了更好的解耦


    我只在有合适的继承关系(根据)的情况下使用子类化(模板模式),我正在改变的算法需要访问基类的受保护方法,我需要高度的内聚性。

    这几乎不足以让我们得出有用的答案……新的并不一定意味着更好。只是说“委托也可能有助于测试,因为不需要提取接口或子类来隔离方法吗?@Andrei:是的,它很可能使测试更简单,尽管我不会将您的设计决策建立在它之上。。。这在很大程度上取决于上下文——不过,您通常不希望创建新的派生类来进行测试。