c# - 抽象类与空实现方法的继承类案例的设计模式
问题描述
您能否为以下场景推荐一个好的实践模式:我有一个定义常见行为的基本抽象类和两个继承类,每个类都定义了一组不同的实现方法。然后在创建代码中(假设通过配置)我为每种配置设置选择我想要的实现并调用“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
s 列表。
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);
}
}
推荐阅读
- c# - 单击按钮时如何获取包含按钮的stacklayout?
- json - 使用 jq 从数组 json 中选择值
- google-cloud-platform - 使用谷歌云运行简单的代理脚本时出现 403 Forbidden
- python - PyMongo $regex 跨所有文本字段和子字段
- dataframe - 如何根据与其他行的关系提取 DataFrame 中的某些行
- python - Python Dash:在本地和 Heroku 服务器上部署应用程序时的不同输出
- python - 无法与 Oanda Api 成功关闭交易
- javascript - 如何从嵌入中获取信息?
- python - 使用 np.sign() 添加一个新的 DF 列,该列根据其他列符号而变化
- microsoft-graph-api - 如何从外部应用程序发起 Microsoft Teams 通话(最好是视频)?