我对继承实现的当前理解是,只有存在IS-A关系时,才应该扩展类。如果父类可以进一步具有具有不同功能的更特定的子类型,但将共享在父类中抽象的公共元素。
我质疑这种理解,因为我的Java教授建议我们这样做。他建议JSwing
我们在课堂上建立一个应用程序
一个都应该延伸JSwing
类(JFrame
,JButton
,JTextBox
等)到单独的自定义类和在其中指定GUI相关的定制(例如部件尺寸,部件的标签,等)
到目前为止还算不错,但是他进一步建议每个JButton应该有自己的自定义扩展类,即使唯一的区别是标签。
例如,如果GUI有两个按钮,则“ 确定”和“ 取消”。他建议应将它们扩展如下:
class OkayButton extends JButton{
MainUI mui;
public OkayButton(MainUI mui) {
setSize(80,60);
setText("Okay");
this.mui = mui;
mui.add(this);
}
}
class CancelButton extends JButton{
MainUI mui;
public CancelButton(MainUI mui) {
setSize(80,60);
setText("Cancel");
this.mui = mui;
mui.add(this);
}
}
如您所见,唯一的区别在于setText
功能。
那么这是标准做法吗?
顺便说一句,讨论该课程的课程称为Java最佳编程实践
[教授回覆]
因此,我与教授讨论了这个问题,并提出了答案中提到的所有观点。
他的理由是子类在遵循GUI设计标准的同时提供了可重用的代码。例如,如果开发人员在一个窗口中使用了自定义Okay
和Cancel
按钮,则将相同的按钮放置在其他Windows中也将变得更加容易。
我知道了我想起的原因,但它仍然只是在利用继承并使代码易碎。
后来,任何开发人员可以无意中调用setText
上的Okay
按钮,并改变它。在这种情况下,子类变得很麻烦。
JButton
当您可以简单地创建一个JButton
并在类外部调用相同的公共方法时,为什么还要在其构造函数中扩展并调用公共方法呢?