![](/img/trans.png)
[英]How to force implementation of an abstract classes members in the inheriting class?
[英]design pattern for the case of abstract class with inheriting classes with empty implementation methods
您能否为以下情况推荐一个良好的实践模式:我有一个定义抽象行为的基本抽象类,以及两个继承类,每个继承类定义了一组方法,这些方法将一个实现与另一个实现区分开。 然后在创建代码中(通过配置说),我针对每种配置设置选择所需的实现,并调用“ 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个方法,这些方法在继承类之一中为空。 我应该使用哪种设计模式来克服这个问题并避免代码重复?
鉴于所有这些功能似乎都具有相同的签名,可以想象可以使用Action
列表。
abstract class CommonParent
{
private readonly List<Action> _funcs = new List<Action>();
private void CommonA() { }
private void CommonB() { }
protected void AddAction(Action action) => _funcs.Add(action);
protected CommonParent()
{
_funcs.Add(CommonA);
_funcs.Add(CommonB);
}
internal void Execute()
{
foreach(Action action in _funcs)
action();
}
}
class FirstChildClass : CommonParent
{
private void UniqueA() { }
private void UniqueB() { }
private void UniqueC() { }
public FirstChildClass()
{
AddAction(UniqueA);
AddAction(UniqueB);
AddAction(UniqueC);
}
}
class SecondChildClass : CommonParent
{
private void UniqueD() { }
private void UniqueE() { }
private void UniqueF() { }
public SecondChildClass()
{
AddAction(UniqueD);
AddAction(UniqueE);
AddAction(UniqueF);
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.