【发布时间】:2017-06-16 13:35:52
【问题描述】:
我目前有一个 A 类,它有一些我想在 B 中使用的功能。A 有一个 Button 类型的成员变量,而在 B 中我想使用 IconButton 类型(派生自 Button)。
类是这样的:
public class A {
protected Button x = new Button();
A() {
x.xx();
}
public void doFirstThing() {
x.xx();
}
Button getButton() {
return x;
}
}
public class B extends A {
B() {
x = new IconButton();
getButton().yy();
}
public void doSecondThing() {
getButton().zz();
}
IconButton getButton() {
return (IconButton) x;
}
}
public class Button {
public void xx() {
}
}
public class IconButton extends Button {
public void yy() {
}
public void zz() {
}
}
如您所见,方法yy() 和zz() 仅在IconButton 中可用,因此我需要通过提供方法getButton 在B 中执行“解决方法”。
是的,通常我们在 A 中也有一个 getButton() 方法,所以这并不是对 B 的牵强附会。
但我想知道,这真的是正确的做法还是我做错了?
我也想过创建一个抽象类,例如A0,它将包含来自 A 的当前代码。然后我会做:
class A extends A0<Button> {
// mostly empty, code taken from A0
}
class B extends A0<IconButton> {
// custom things here
}
或者还有其他方法可以更好地解决这个问题吗?
这是我的 GWT 应用程序中的一个组件。所以,如果我像@king_nak 所说的那样声明,那么我的组件中将有两个按钮。或者,如果我可以接受另一种解决方法,我可以删除 B 中的原始按钮,例如x.removeFromParent() 或类似的东西,但它会成为一个全新的不良做法。
【问题讨论】:
-
abstract class A<T extends Button>的字段为T x和class B extends A<IconButton>怎么样? -
我不确定您是否打算在某个时候构造
A类的实例。如果是这样,那么没关系,除了不需要IconButton getButton()。如果您不会创建A的实例,则将其设为抽象是 -
IconButton 是 B 的一个实现细节。为什么要将 IconeButton 和 Button 暴露给这些类的客户端?
标签: java oop gwt object-oriented-analysis