两个不同的继承链而不破坏DRY原则

时间:2016-07-10 09:35:42

标签: c# inheritance design-patterns abstract-class dry

我在使用正确的继承链时遇到了问题而没有放弃DRY原则的优点。

鉴于以下结构:

  • 抽象类A是我所有类的基础
  • 抽象类B:A是我所有具有特殊功能的类的基础(通过B提供)

现在,我需要有两个具有相同功能的新类。但是一个是A型,而另一个是B型。(这不能改变!) 这两个类都应该有一个方法SetSize()

所以最后会有C类:A和D:B,两者都有相同的SetSize方法。

问题:如何创建一个基类中间层,让SetSize() - 方法只声明/实现一次(DRY)? 我猜想使用接口或一些静态辅助类来实现SetSize()的逻辑?

是否有任何模式或最佳实践来实现此行为?

2 个答案:

答案 0 :(得分:2)

你不能通过C#中的继承来做到这一点,因为它不支持多重继承;语言为这种情况提供的工具是接口:

public interface  
{     
    void SetSize(Size size);
}

public SizableA: A, ISizable { ... }
public SizableB: B, ISizable { ... }

还要记住,当继承链中的类型具有关系时,应该使用继承(CatAnimal,{{1当一个完全不相关的类具有非常特定的共同行为时,接口是首选;}}是B等等。 AIEquatableIComparable等。您的IDisposable行为似乎更适合这最后一个类别,因为它似乎不是{特定于{的功能{1}}或SetSize

现在,如果AB都应该共享SizableA的相同实现,那么最好的解决方案是使用合成或简单地委派功能:

SizableB

答案 1 :(得分:0)

创建一个抽象类,包括SetSize()方法和A和B类的公共属性。然后A和B类继承抽象类。