抽象方法签名,继承和"Do"命名约定

T. *_*ter 5 c# abstract-class design-patterns

我正在学习设计模式,在代码示例中,我看到了抽象类声明方法的约定,例如:

public abstract class ServiceBase {
... 

public virtual object GetSomething();
Run Code Online (Sandbox Code Playgroud)

然后

protected abstract object DoGetSomething();
Run Code Online (Sandbox Code Playgroud)

我的问题是为什么这两种方法存在,因为它们看起来服务于同一目的.这是为了让继承的类不能覆盖基类GetSomething()方法逻辑吗?但话说再次,该方法被标记为虚拟,所以无论如何它都可以被覆盖.在可以调用虚方法时,要求派生类实现者实现抽象方法有什么用呢?

ito*_*son 4

一个常见的原因是围绕抽象方法进行标准处理。例如,也许抽象方法只能在某些情况下调用——例如,在样条线被网状化之后。在这种情况下,在一个地方(公共 GetSomething 方法)检查​​ _areSplinesReticulated 是有意义的,而不是要求抽象方法的每个实现都执行自己的检查。或者也许 GetSomething 是 90% 的样板文件,但需要一些额外的逻辑或只有派生类才能提供的关键信息。

这是模板方法模式的一种形式。

非虚拟 GetSomething 意味着每个派生类都获得标准处理,并且只能通过其自定义版本的 DoGetSomething 参与。如果 GetSomething 是虚拟的,则意味着派生类可以根据需要绕过标准处理。这两种策略中的任何一个都是可行的策略,具体取决于标准 GetSomething 处理是否是类逻辑的组成部分(例如不变量),或者基类是否希望为派生类授予最大的灵活性。