我有一个提供某些功能的基础class A
和一个在B extends A
之上提供附加功能的子类A
。
假设课程C
,D
和E
扩展A
,我将如何构建C
,D
和{ {1}}而是扩展E
(不会创建基本上与B
,C
和D
重复的新类?
除了E
扩展C
之外,仍然需要扩展D
的{{1}},E
和A
类。
例如(随意改进):
B
目标是能够创建A = Ball - provides basic things that are shared by all balls
B = Beach ball - provides some beach ball specific things
C has a method roll() that could allow A or B to roll
D has a method bounce() that could allow A or B to bounce
E has a method spin() that could allow A or B to spin
Any ball can have all, some, or none of the features C, D, and E
或A
类型的对象,其中包含集合B
中的要素,而无需为所有可能的组合制作类
答案 0 :(得分:1)
在java中,类只能扩展一个类。如果你想要扩展B而不是A的C,D和E的实现,你必须创建新的类。
但是,行为可以通过其他类层次结构来控制。
一种选择是将delegation pattern与接口结合使用:
interface MyInterface {
public void someMethod();
}
class A implements MyInterface {
public void someMethod() {
// do something
}
}
class B extends A {
public void someMethod() {
// do something different
}
}
class C implements MyInterface {
private final MyIntegerface delegate;
public C(MyIntegerface delegate) {
this.delegate = delegate;
}
public void someMethod() {
delegate.someMethod();
}
}
构造C对象的客户端将客户希望C使用的委托传递给它:
C x = new C(new A());
C y = new C(new B());
C类只有一个定义,但它有多种行为方式。
答案 1 :(得分:0)
如果B类扩展A.那么你可以使Classes(C,D和E)扩展为B类而不是A.这三个类(C,D和E)可以使用公共功能(属性和方法)在B和A类(继承层次结构)中都可用。
答案 2 :(得分:0)
B类扩展了A类。因此,A类的所有功能都将在B类中继承。
Class B extends A{}
现在您希望C,D,E类扩展A类和B类的功能,这可以通过简单地扩展B类而不是A类来实现
Class C extends B{}
Class D extends B{}
Class E extends B{}
答案 3 :(得分:0)
直接扩展B类而不是A类。如果你研究this
,你可以更好地理解答案 4 :(得分:0)
在Ball Class中添加Ball Like roll(),bounce()和spin()的基本功能,因为所有Ball应该具有这三个。并且在B级中扩展A级,这样你可以实例化球和沙滩球,其中球和沙滩球都将具有滚动弹跳,旋转和沙滩球将具有其自身的特征
答案 5 :(得分:0)
我的猜测:
abstract class Ball {
< some common functionality >
}
现在BeachBall是一个具体的类,它是一个特定的球。所以你应该把它作为一个单独的类,现在
:
class BeachBall extends Ball {
< some common functionality inherited from Ball >
<additional functionality>
}
其他类如C,D,E也是具体的类,并假设它是另一种类型的球,所以:
class C extends Ball {
< some common functionality inherited from C >
<additional C funcionality>
}
<other classes are ommited>
或者如果您的C,E,D类是更具体的BeachBall类型,可以这样做:
class C extends BeachBall {
< some common functionality inherited from BeachBall & Ball >
<additional C funcionality>
}
<other classes are ommited>
N.B <other classes are ommited>
表示同样适用于E,D与C相同。