我非常清楚它可以在界面的帮助下完成,而且我已经多次完成了。但这次我的情况有很大不同。我有class A
,class B
我需要创建另一个class C
,它同时扩展了A和B,因为C应该具有两种功能,并且还注意A和B不是相互关联的,所以即使我不能说A可以延长class B
。
我很困惑,我现在该怎么办。我知道我们不能改变java ...但至少会有一些方法可能。即使是最近的也可以......请帮帮我。
添加更多详细信息: - Class B
是标准API,而class A
是需要由所有异常类继承的常见异常类。
相关问题:
答案 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>
我有一个需要遵循的设计模式,因此必须延长
这是,你可能知道完全不可能。但是,您可以为A
和B
创建将功能委派给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 - 实现是你的决定。