C#抽象方法只用基类实现?

4ZM*_*4ZM 7 c# architecture oop inheritance

请考虑以下问题:

你有一个类'A'作为许多其他类似类的基类,例如.一个叫B的班级

A类在它自身中很有用(并且已经在整个地方使用过),因此不是抽象的.

关键在于您现在希望强制执行一个新协议,要求所有继承自A(包括A本身)的类实现方法'func()'.如果子类忘记实现func(),则应该存在编译器错误.

class A {
  A func() { ret new A(...) }
}

class B : A {
  A func() { ret new B(...) }
}

class C : A {
  // Should give error : no func()
}
Run Code Online (Sandbox Code Playgroud)

问题清楚了吗?我不能创建A :: func()抽象,因为我希望能够继续使用A作为具体类.我无法使其成为虚拟,因为这会导致子类回退到超类(而不是给编译器错误).

接近解决方案的唯一方法是创建一个新的抽象类A*并使所有自定义类型继承自该类,并将A的所有当前用法替换为具有继承自A*的新类"DefaultA"的具体类.这看起来很乱.请告诉我还有其他方法可以做到这一点吗?

Jar*_*Par 10

A如果子类型不覆盖特定方法,则根本无法保持具体类型并强制编译器错误.


joh*_*y g 1

如果这就是您需要做的,那么是的。

但在我看来,您可能希望重新考虑这一要求。我经常实现类似的框架,其中强制在子类中实现是一个聪明的技巧。然后我发现,作为这些框架的使用者,我会重复代码或默认使用一些愚蠢的实现(例如空方法)。这两种方式都不是理想的,因为它们会增加混乱和噪音,并降低可维护性。

此外,如果此模式的应用程序是作为自工厂(即您的示例具有返回其自身实例的子类),那么您可能希望尝试不同的东西,例如适当的工厂模式。呃,我所说的“尝试”是指利用控制反转容器,例如 Castle Windsor、Ninject、Unity。