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

时间:2011-08-29 13:20:38

标签: java oop multiple-inheritance

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

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

添加更多详细信息: - Class B是标准API,而class A是需要由所有异常类继承的常见异常类。

相关问题:

8 个答案:

答案 0 :(得分:11)

这通常使用object composition来解决。

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

Java限制某个类将 -relation 分配给两个(不相关的)类。它确实限制一个类使用两个不相关类的 功能


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 应该有意义。)< / p>


  

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

这是,你可能知道完全不可能。但是,您可以为AB创建将功能委派给C - 实例的代理类。例如,将这两个方法添加到上面的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();
            }
        };
    }
}

答案 1 :(得分:5)

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

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

答案 2 :(得分:3)

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

答案 3 :(得分:1)

利用作文。 C类将包​​含A和B类的实例。

答案 4 :(得分:1)

您可以尝试创建class C,其中包含一个class A实例和一个class B及其方法(创建具有相同名称的方法,只调用{{1}中的方法和A),它被称为组合 - 与继承相反的另一种方法。当然,如果您不需要B来使用instanceof类,那就是这种情况。

答案 5 :(得分:1)

一个常见的oop原则是“选择组合而不是继承”,因为你不能扩展2个类我建议将这些类中的一个或两个作为C类成员,这当然是否适用于你正在努力做到。

答案 6 :(得分:1)

也许你可以创建一个新的D类,让A类和B类继承D?

答案 7 :(得分:1)

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