OOD,继承和Layer Supertype

时间:2011-11-09 20:53:29

标签: c# oop inheritance polymorphism

我有一个问题,即在基类中保存公共代码并让派生类调用它,即使已从基类调度派生类的触发器方法。因此,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
  }
}

4 个答案:

答案 0 :(得分:3)

看起来非常好。为什么要在接口上使用抽象类的完美示例。这有点像战略模式,我已经相当经常地成功地使用了它。

确保班级所做的事情仍在处理一个“关注点”,只做一项任务。如果您的基类执行存储库访问但对象代表文档,请不要将功能放在基类中,使用单独的存储库模式/对象。

答案 1 :(得分:1)

看起来像一个非常简化的Template Method Pattern,您的子类在算法实现的正确点处执行某些特定类型的操作,但整个流程由基类上的方法指示。您还以基类方法的形式为子类提供了一些服务;只要你对SOLID有好处,那也没关系。

答案 2 :(得分:0)

它确实闻到SomeCommonMethodToSaveOnDuplication以两种不同的方式被调用。它似乎在做两件无关的事情。为什么没有两种方法?

答案 3 :(得分:0)

为什么不public abstract void DoSomething()而忘记ImplementThis()呢?

我可以看到离开ImplementThis()的唯一原因是,如果您希望与DoSomething()保持一致的界面,那么稍后将允许ImplementThis()的签名更改对来电者的重大改变。

我同意你应该对班级的责任保持一个问题,但从整体OOP的角度来看,这看起来很好。我在很多场合都做过类似的事情。