我应该多么积极地保持DRY?

joe*_*dev 5 c# oop inheritance interface

当我向另一个问题提出答案时,我想到了这个问题.假设我有一个基类

public abstract class BaseClass {}
Run Code Online (Sandbox Code Playgroud)

有一些相当数量的派生类 - 让我们说超过六个.大多数派生类除了从基类继承之外没有任何相似性,但是其中两个具有相似性

public class OneOfMyDerivedClasses : BaseClass
{
    public string SimilarProperty {get; set;}
    //Other implementation details
}

public class AnotherOneOfMyDerivedClasses : BaseClass
{
    public string SimilarProperty {get; set;}
    //Other implementation details, dissimilar to those in OneOfMyDerivedClasses
}
Run Code Online (Sandbox Code Playgroud)

而已.这是任何子类除了继承之外的唯一相似之处BaseClass.在我的实际应用程序中,我通过IHaveSimilarProperty定义单个SimilarProperty属性的接口解决了这个问题,因为我关心的是一个对象实现了所使用的接口.但是由于我有重复,我应该为这两个派生类定义一个中间基类来继承,即

public abstract IntermediateBaseClass : BaseClass
{
    public string SimilarProperty {get; set;}
}
Run Code Online (Sandbox Code Playgroud)

我也可以结合两种方法,用界面装饰中间类......

所以我的问题在于是否足够重复以保证OOP最佳实践方面的中间基类.我是否应该积极地消除所有重复,或者我应该采取更务实的方法?如果是后者,哪些经验法则会促使我选择一种方法而不是另一种方法呢?

D S*_*ley 4

任何设计模式都可以走极端。以下是我在决定是否进行子类化时会使用的一些一般准则:

  • 代码量是否比较大(>10行)?
  • 代码是否需要定期更改(例如业务规则)
  • 我是否需要使用多态性(使用基类或接口而不是子类之一是否有意义)

在您的情况下,由于唯一的相似之处似乎是两个类中具有相同名称的属性,因此可能不值得进行子类化。

  • 子类化不仅“不值得”,而且如果子类并不真正代表基类的专门版本,那么这样做是完全错误的。“重用”本身不应该成为子类化的原因。 (5认同)