如何创建一个“扩展”两个现有具体类的类

我非常清楚它可以在界面的帮助下完成,而且我已经多次完成了。 但这次我的情况有很大不同。 我有class A class B ,我需要创建另一个class C ,它扩展了A和B,因为C应该具有两个function,并且还注意A和B不是相互关联的,所以即使我不能说A可以扩展class B

我现在应该怎么做才很困惑。 我知道我们不能改变java …但至少会有一些方法可能。 即使是最近的也可以……请帮帮我。

添加更多细节: – Class B是标准API,而class A是需要由所有exception类inheritance的公共exception类。

相关问题:

  • 为什么Java中没有多重inheritance,但允许实现多个接口? (虽然我上面的问题并不是为什么不允许这样做。)

这通常使用对象组合来解决。

在Effective Java中也提倡这一点,第16项: 赞成组合而不是inheritance

Java限制一个类与两个(不相关的)类相关。 但是,它不会限制类具有两个不相关类的function


 class A { void doAStuff() { System.out.println("A-method"); } } class B { void doBStuff() { System.out.println("B-method"); } } // Wraps an A and a B object. class C { A aObj; B bObj; void doAStuff() { aObj.doAStuff(); } void doBStuff() { bObj.doBStuff(); } } 

(或者你可以让class C extends A并且只为B创建包装器方法,但请记住,说C是A是有意义 。)


我有一个需要遵循的设计模式,因此必须延长

这是,你可能知道完全不可能。 但是,您可以为AB创建代理类, A将function委派给C -instance。 例如,通过将这两个方法添加到上面的C类:

 class C { // ... public A asAObject() { return new A() { @Override void doAStuff() { C.this.doAStuff(); } }; } public B asBObject() { return new B() { @Override void doBStuff() { C.this.doBStuff(); } }; } } 

http://en.wikipedia.org/wiki/Adapter_pattern

适配器模式解决了您的问题。 我回去检查维基文档,只是为了确定:)

在Java中,不可能扩展两个类,从而inheritance两者的function。 最简单的替代方法是“包装”两个类中的至少一个。 所以,不是也扩展B,你可以在C中有一个B的实例,并在C上声明每个B的方法,并传递它们。 C不会“成为”B,但听起来你只想inheritancefunction。 如果A也是如此,那么,你应该将这种模式用于A和B,而不是延伸。

利用构图。 C类将包​​含A和B类的实例。

您可以尝试创建class C ,它将包含一个class A实例和一个class B及其方法(创建具有相同名称的方法,只调用AB方法),它被称为Composition – 另一个与inheritance相反的方法。 当然,如果您不需要instanceof来使用该C类,那么就是这种情况。

一个常见的oop原则是“选择组合而不是inheritance”,因为你不能扩展2个类,我建议将这些类中的一个或两个作为C类成员,当然,如果它适用于你想要的东西做。

也许你可以创建一个新的D类,并且A和B都inheritance自D?

改变你的想法。 在界面中思考。 这意味着A类实际上是接口A’的实现,而B类是接口B’的实现。 而你实际上想要一个实现接口A’和B’的C类。 C类不需要扩展任何东西或使用任何特定模式或任何其他模式。 它可以扩展A并将一些方法委托给B,或者它可以扩展B并将一些方法委托给A.或者它可以将所有方法委托给A和B – 实现是你的决定。