我有一个问题,即在基类中保存公共代码并让派生类调用它,即使已从基类调度派生类的触发器方法。因此,base-> derived->基类型调用堆栈。
以下内容看起来不错,还是有异味?我已经对流程步骤进行了编号......
public abstract class LayerSuperType
{
public void DoSomething() // 1) Initial call from client
{
ImplementThis(); // 2) Polymorphic dispatch
}
protected abstract void ImplementThis();
protected void SomeCommonMethodToSaveOnDuplication(string key) // 4)
{
Configuration config = GetConfiguration(key);
}
}
public class DerivedOne : LayerSuperType
{
protected virtual void ImplementThis() // 2)
{
SomeCommonMethodToSaveOnDuplication("whatever"); // 3) Call method in base
}
}
public class DerivedTwo : LayerSuperType
{
protected virtual void ImplementThis() // 2)
{
SomeCommonMethodToSaveOnDuplication("something else"); // 3) Call method in base
}
}
答案 0 :(得分:3)
看起来非常好。为什么要在接口上使用抽象类的完美示例。这有点像战略模式,我已经相当经常地成功地使用了它。
确保班级所做的事情仍在处理一个“关注点”,只做一项任务。如果您的基类执行存储库访问但对象代表文档,请不要将功能放在基类中,使用单独的存储库模式/对象。
答案 1 :(得分:1)
看起来像一个非常简化的Template Method Pattern,您的子类在算法实现的正确点处执行某些特定类型的操作,但整个流程由基类上的方法指示。您还以基类方法的形式为子类提供了一些服务;只要你对SOLID有好处,那也没关系。
答案 2 :(得分:0)
它确实闻到SomeCommonMethodToSaveOnDuplication以两种不同的方式被调用。它似乎在做两件无关的事情。为什么没有两种方法?
答案 3 :(得分:0)
为什么不public abstract void DoSomething()
而忘记ImplementThis()
呢?
我可以看到离开ImplementThis()
的唯一原因是,如果您希望与DoSomething()
保持一致的界面,那么稍后将允许ImplementThis()
的签名更改对来电者的重大改变。
我同意你应该对班级的责任保持一个问题,但从整体OOP的角度来看,这看起来很好。我在很多场合都做过类似的事情。