当每个人第一次开始看到类层次结构的有用性时,他们似乎都注意到了这个问题。问题源于类中的正交问题。一些子类共享特征 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);
}