代码重构:基类的两个但不是所有派生类都具有相同的重写方法

时间:2017-05-08 17:58:28

标签: oop design-patterns

在C#中,类B是三个类CDE的唯一基类。

B有一个virtual方法,该方法在CDE中被覆盖。 CD具有覆盖方法的相同实现,与E中的实现不同。

CD没有其他共同点。

如何删除CD之间的代码重复?

我正在考虑的两种方式是:

  1. 创建一个源自F的新类B,并使CD派生自F而不是B。将公共覆盖方法移至CDF。我认为这有点矫枉过正,因为CD没有其他共同点。

  2. B中创建一个新方法,其名称与虚方法不同,并且与CD中的常用覆盖方法实现相同。然后更改CD中常用覆盖方法的实现,只需调用B中的新方法。这是一个优雅的解决方案?它是一些设计模式还是面向对象的技巧?

  3. 感谢。

    我没有将C#添加为标记,因为我认为问题不是C#特定的,而是所有面向对象语言的一般问题。

1 个答案:

答案 0 :(得分:1)

使用Strategy design pattern。我们的想法是优先考虑组合而不是继承,因为继承可能导致深层次结构,并且通常是错误的代码重用方式。

Java代码:

class B {}

class C extends B {
    Behaviour1 b1;
}

class D extends B {
    Behaviour1 b1;
}

class E extends B {
    Behaviour2 b2;
}

class Behaviour1 extends Behavior {}

class Behaviour2 extends Behavior {}

您仍然可以利用继承来实现多态行为。