【问题标题】:OOD, inheritance, and Layer SupertypeOOD、继承和层超类型
【发布时间】:2011-12-25 16:07:16
【问题描述】:

我有一个关于在基类中保存公共代码并让派生类调用它的问题,即使派生类的触发器方法已从基类分派。所以,base->derived->base type call stack.

下面的看起来还可以,还是有味道?我已经对流程步骤进行了编号...

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
  }
}

【问题讨论】:

标签: c# oop inheritance polymorphism


【解决方案1】:

看起来绝对没问题。为什么要在接口上使用抽象类的完美示例。这有点像一种策略模式,我已经相当频繁地成功地使用了它。

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

【讨论】:

    【解决方案2】:

    看起来像一个非常简化的Template Method Pattern,您的子类在算法实现的正确位置做一些特定类型的事情,但整体流程由基类上的方法指导。您还以基类方法的形式为您的子类提供了一些服务;只要你在SOLID 方面做得很好,那也没关系。

    【讨论】:

      【解决方案3】:

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

      【讨论】:

      • 我的例子有点弱...我已经更新了 SomeCommonMethodToSaveOnDuplication 的主体...
      • 我没有注意到那里有任何变化,所以我想这意味着它对我来说仍然有味道。
      • 嗯,它不是在做两件不同的事情。它正在调用一个基本方法来获取两个项目的配置。配置获取的实现只会因正在寻找的密钥而异。
      • 是的,新的配置版本确实去除了异味。
      【解决方案4】:

      为什么不public abstract void DoSomething() 而完全忘记ImplementThis()

      我可以看到离开ImplementThis() 的唯一原因是,如果您想与DoSomething() 保持一致的界面,稍后将允许ImplementThis() 的签名更改而不会对调用者进行重大更改。

      我同意你应该只关注班级的责任,但从整体 OOP 的角度来看,这对我来说很好。我在很多场合都做过类似的事情。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-05-03
        • 1970-01-01
        • 1970-01-01
        • 2015-03-14
        • 2020-08-31
        • 1970-01-01
        相关资源
        最近更新 更多