【发布时间】:2019-08-06 12:36:00
【问题描述】:
您能否为以下场景推荐一个好的实践模式: 我有一个定义公共行为的基本抽象类和两个继承类,每个继承类都定义了一组方法,这些方法不同于另一个实现。 然后在创建代码中(假设通过配置)我为每种配置设置选择我想要的实现并调用“doWork”,我的问题是如何避免继承类中的“空”实现以防继承类选择不实现该方法。
abstract class CommonParentClass{
public void doWork()
{
commonA();
commonB();
uniqueA();
uniqueB();
}
internal void commonA()
{
//do work which is same for inheriting classes
}
internal void commonB()
{
//do work which is same for inheriting classes
}
abstract void uniqueA();
abstract void uniqueB();
abstract void uniqueC();
}
class FirstChildClass:CommonParentClass
{
protected void uniqueA()
{
//implementation specific to first child
}
protected void uniqueB()
{
//EMPTY
}
protected void uniqueC()
{
//implementation specific to first child
}
}
class SecondChildClass:CommonParentClass
{
protected void uniqueA()
{
EMPTY
}
protected void uniqueB()
{
//implementation specific to second child
}
protected void uniqueC()
{
//implementation specific to second child
}
}
我有大约 5/6 的方法在其中一个继承类中是空的。 我应该使用什么设计模式来克服这个问题并避免代码重复?
【问题讨论】:
-
internal common()和abstract unique()在继承类中具有唯一代码。不要让你的基类知道继承类。 -
如何使用继承 CommonParentClass 的非抽象 CommonParentClassBase 与 uniqueA、uniqueB 和 uniqueC 作为虚拟成员?
-
“避免空实现”是什么意思?如果您不想要求子类实现方法(或显式提供空实现),请不要将它们标记为抽象。如果您确实需要它,请将它们保留为抽象的。
-
所以假设我的电话是 CommonClass c=new FirstChildClass(); c.doWork();
-
在这种情况下你不能真正强制执行。您的选择是 1) 不允许覆盖该方法 2) 提供默认实现并可选择允许覆盖它或 3) 要求覆盖和实现该方法。除此之外,您无法真正控制开发人员选择实现该方法的方式。
标签: c# design-patterns