【问题标题】:Two different Inheritance-chains without breaking the DRY-principle在不破坏 DRY 原则的情况下,两个不同的继承链
【发布时间】:2016-11-12 10:19:54
【问题描述】:

我在使用正确的继承链而不丢失 DRY 原则的好部分时遇到了问题。

给定以下结构:

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

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

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

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

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

【问题讨论】:

  • SetSize 的行为是否对所有实现都相同? (对于 A 类和 B 类,正如你提到的 dry)?
  • @Yogi 两种实现的方法完全相同。这就是为什么我正在寻找一种方法来在一个点上拥有它

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


【解决方案1】:

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

public interface  
{     
    void SetSize(Size size);
}

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

还请记住,当继承链中的类型具有 is a 关系(CatAnimalB 是 @987654325 @ 等),而当完全不相关的类具有非常特定的共同行为时,首选接口; IEquatableIComparableIDisposable 等。您的 SetSize 行为似乎更适合最后一类,因为它似乎不是 AB 特有的功能。

现在,如果 SizableASizableB 应该共享 SetSize 的相同实现,那么最好的解决方案是使用组合或简单地委托功能:

public interface ISizable
{
     void SetSize(Size size, ISetSizeProvider provider); //Alternatively inject provider in SizableA and SizableB's constructor to get composition.
}

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2011-01-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-04-21
      • 1970-01-01
      相关资源
      最近更新 更多