当他们第一次看到类层次结构的有用性时,每个人似乎都注意到了这个问题。问题源于类中的正交问题。一些子类共享特征 1,一些共享特征 2。有些则两者都没有。有些人两者都有。
如果只有一个特征……(比如说,有些有内部,所以它们可以被填充。)……我们会没事的。创建一个中间子类来处理这些问题。一些子类实际上是中间子类的子类。我们完成了。
但是有两个并且没有办法进行子类化。我认为多重继承是该问题的解决方案,但它增加了一定程度的复杂性并颠覆了使分层类结构有用的思维简单性。
我发现最好使用子类化来解决它容易解决的一个问题。然后选择一种方法来隔离和共享代码,而不是子类化。
一种解决方案是提取功能并将其移至别处。然后所有的 Aj 和 Ci 都可以在那里调用它。优点是您无需复制和粘贴任何代码,如果它被破坏,它可以在一个地方修复。
一代码可以进入基类 A 并指定一个名称,表明它仅适用于某些子类。使方法受到保护。然后从实际的类中调用它们。它丑陋但有效。
一个
protected String formStringForSubclassesAjAndCi(String a, int b) {
return a + b;
}
Ci和Aj
public String formString(String a, int b) {
return formStringForSubclassesAjAndCi(a, b);
}
两个类似地,您可以将共享代码放在某种帮助器类中:
CiAjHelper
public static String formStringForSubclassesAjAndCi(String a, int b) {
return a + b;
}
Aj 和 Ci
public String formString(String a, int b) {
return CaAjHelper.formStringForSubclassesAjAndCi(a, b);
}
三第三种方法是将代码放在 Aj 中,然后从 Cj 调用它,方法是为每个 Ci 实例创建一个 Aj 实例并将公共函数委托给它。(它仍然很丑。)
Aj
public String formString(String a, int b) {
return a + b;
}
Cj
private Aj instanceAj = new Aj();
public String formString(String a, int b) {
return instanceAj.formString(a, b);
}