java设计模式/多重继承解决方案

java设计模式/多重继承解决方案,java,design-patterns,multiple-inheritance,Java,Design Patterns,Multiple Inheritance,我有一个带有类层次结构的Java包,比如说带有子类A1、A2、A3 对于一个特定的应用程序,我需要创建实现接口B的类(类型a)。这些新类有一些共同点,所以我的第一个想法是创建一个基类C,它继承a并实现B,以及我的新类C1、C2、C3。。。但是,这些类中的一些Ci将需要Aj中存在的功能,通过这种方法,我需要重新实现这些功能(未在A中定义的功能)。对于一些Ci,我希望继承各种Ai的行为,但同时继承所有Ci的其他常见行为,即C语言。当然,Java不允许多重继承,所以我不能直接这样做。我当然不想因为MI

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


对于一个特定的应用程序,我需要创建实现接口B的类(类型a)。这些新类有一些共同点,所以我的第一个想法是创建一个基类C,它继承a并实现B,以及我的新类C1、C2、C3。。。但是,这些类中的一些Ci将需要Aj中存在的功能,通过这种方法,我需要重新实现这些功能(未在A中定义的功能)。对于一些Ci,我希望继承各种Ai的行为,但同时继承所有Ci的其他常见行为,即C语言。当然,Java不允许多重继承,所以我不能直接这样做。我当然不想因为MI不受支持而重新实现这么多东西,但我看不到解决方法。有什么想法吗?

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

听起来您使用的是复合模式,可能还有策略模式:


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

当每个人第一次看到类层次结构的有用性时,似乎都注意到了这个问题。这个问题源于类中的正交关注点。一些子类共享特征1,一些子类共享特征2。有些人两者都没有。有些人两者都有

如果只有一个特征。。。(比如说,有些人有一个内部,所以他们可以填补。)。。。我们会没事的。创建一个中间子类来处理这些问题。有些子类实际上是中间类的子类。我们完成了

但是有两种,并且没有办法进行子类化。我认为多重继承是这个问题的解决方案,但它增加了复杂性,颠覆了使分层类结构变得有用的思维的简单性

我发现最好使用子类化来解决一个容易解决的问题。然后选择一种除了子类化之外的隔离和共享代码的方法

一种解决方案是提取功能并将其移动到其他地方。然后所有的Aj和Ci都可以在那里调用它。其优点是,您不需要复制和粘贴任何代码,如果代码被破坏,它可以在一个地方修复

One代码可以进入基类A,并给出一个名称,表明它只适用于一些子类。使方法受到保护。然后从实际的类中调用它们。它丑陋但有效

A

Ci与Aj

public String formString(String a, int b) {
    return formStringForSubclassesAjAndCi(a, b);
}
Two类似地,您可以将共享代码放在某种帮助器类中:

切杰尔珀

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);
}
Three第三种方法是将代码放在Aj中,然后从Cj调用代码,方法是为每个Ci实例创建一个Aj实例,并将公共功能委托给它。(还是很难看。)

Aj

希杰


如果我们有一个图表来准确地看到发生了什么,可能会更容易。似乎在80%的情况下,多重继承的解决方案是
策略模式
。虽然我还没有找到其他20%的价格。是的,但是在这个特殊的情况下,如果可能的话,我宁愿避免改变现有的价格,也就是说,A和Ai的价格应该保持不变。也许那会太麻烦,我会回到这一点上。那么#3可能会有所帮助。一旦我编辑它,它实际上从1计数到3。我希望子类和代码都可以重用,但是是的,我需要的这个应用程序的子类关系实际上只有C和子类Ci(用于多态性),但我不认为我需要子类A,也许我可以在C中包含一个A类型的字段,各种Ci可以根据需要实例化Aj类型的对象。看起来不错,我会再仔细考虑一下,如果我没有预见到问题的话,试一下。谢谢
public String formString(String a, int b) {
    return CaAjHelper.formStringForSubclassesAjAndCi(a, b);
}
public String formString(String a, int b) {
    return a + b;
}
private Aj instanceAj = new Aj();

public String formString(String a, int b) {
    return instanceAj.formString(a, b);
}