在C#中,类B
是三个类C
,D
和E
的唯一基类。
B
有一个virtual
方法,该方法在C
,D
和E
中被覆盖。 C
和D
具有覆盖方法的相同实现,与E
中的实现不同。
C
和D
没有其他共同点。
如何删除C
和D
之间的代码重复?
我正在考虑的两种方式是:
创建一个源自F
的新类B
,并使C
和D
派生自F
而不是B
。将公共覆盖方法移至C
和D
至F
。我认为这有点矫枉过正,因为C
和D
没有其他共同点。
在B
中创建一个新方法,其名称与虚方法不同,并且与C
和D
中的常用覆盖方法实现相同。然后更改C
和D
中常用覆盖方法的实现,只需调用B
中的新方法。这是一个优雅的解决方案?它是一些设计模式还是面向对象的技巧?
感谢。
我没有将C#添加为标记,因为我认为问题不是C#特定的,而是所有面向对象语言的一般问题。
答案 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 {}
您仍然可以利用继承来实现多态行为。