1

我有一个带有类层次结构的 Java 包,比如带有子类 A1、A2、A3 的 A 类...

对于特定的应用程序,我需要创建实现接口 B 的类(A 类型)。这些新类将有一些共同点,所以我的第一个想法是创建一个从 A 继承并实现 B 的基类 C,而我的新类 C1、C2、C3、... 只会从 C 继承。但是,其中一些类 Ci 需要 Aj 之一中存在的功能,通过这种方法,我需要重新实现此类功能(功能不是在 A) 中定义。对于某些 Ci,我想从各种 Ai 继承行为,但同时继承 C 中所有 Ci 共有的其他行为。当然,Java 不允许多重继承,所以我不能这样做这个直接 我当然不想仅仅因为不支持 MI 就重新实现这么多东西,但我不 没有办法绕过它。有任何想法吗?

4

2 回答 2

1

您真的需要子类化还是只想重用代码?

听起来您使用复合模式和可能的策略模式:

您的 C 类将具有 A 类型和可能 B 类型的字段,并在适当的情况下将调用委托给它们。这为您提供了代码重用的所有优势,而没有继承的混乱(单个或多个)

于 2013-08-14T19:45:55.580 回答
1

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