Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# OOD、继承和层超类型_C#_Oop_Inheritance_Polymorphism - Fatal编程技术网

C# OOD、继承和层超类型

C# OOD、继承和层超类型,c#,oop,inheritance,polymorphism,C#,Oop,Inheritance,Polymorphism,我有一个关于在基类中保存公共代码并让派生类调用它的问题,即使派生类的触发器方法已从基类调度。因此,基本->派生->基本类型调用堆栈 下面的看起来还好吗,还是有味道?我已经编号了流程步骤 public abstract class LayerSuperType { public void DoSomething() // 1) Initial call from client { ImplementThis(); // 2) Polymorphic dispatch }

我有一个关于在基类中保存公共代码并让派生类调用它的问题,即使派生类的触发器方法已从基类调度。因此,基本->派生->基本类型调用堆栈

下面的看起来还好吗,还是有味道?我已经编号了流程步骤

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

看起来绝对不错。完美的例子说明了为什么要在接口上使用抽象类。这有点像一种战略模式,我已经相当经常和成功地使用了它


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

确实有一点闻起来,有些CommonMethodToSaveOnDuplication正在以两种不同的方式调用。它似乎在做两件不相关的事情。为什么没有两种方法?

为什么不
公共抽象void DoSomething()
而忘记
实现this()

我能看到离开
ImplementThis()
的唯一原因是,如果您想与
DoSomething()
保持一致的接口,那么以后将允许
ImplementThis()
的签名更改,而不会对调用方造成中断性更改


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

看起来像是一个非常简化的过程,在算法的实现过程中,子类在正确的点上做一些特定的事情,但是整个流程是由基类上的方法来引导的。您还以基类方法的形式向子类提供了一些服务;只要你做得好就行。

我的例子有点弱。。。我已经更新了一些常用方法的主体以保存副本…我没有注意到任何变化,所以我想这意味着它对我来说仍然有味道。嗯,它没有做两件不同的事情。它调用一个基本方法来获取两个项目的配置。配置获取的实现只会因正在查找的密钥而有所不同。是的,新配置版本确实会消除此气味。