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的角度来看,我觉得这很好。我在很多场合都做过类似的事情。看起来像是一个非常简化的过程,在算法的实现过程中,子类在正确的点上做一些特定的事情,但是整个流程是由基类上的方法来引导的。您还以基类方法的形式向子类提供了一些服务;只要你做得好就行。我的例子有点弱。。。我已经更新了一些常用方法的主体以保存副本…我没有注意到任何变化,所以我想这意味着它对我来说仍然有味道。嗯,它没有做两件不同的事情。它调用一个基本方法来获取两个项目的配置。配置获取的实现只会因正在查找的密钥而有所不同。是的,新配置版本确实会消除此气味。