在开发 java 独立应用程序时,一些开发人员倾向于扩展 JFrame 类并实现(实现)一些 actionlistener 接口(interface)。是不是违反了oops中的泛化概念,也违反了抽象。是不是也违反了单一职责原则。
[编辑] 通过违反 oops 中的泛化概念,我的意思是“is-a”关系变得无效。 继承一个类改为扩展一个类
最佳答案
这种常见的反模式带来了几个问题:
class Application extends JFrame implements ActionListener {}
给定一个 preference for composition over inheritance ,
Application
可能有JFrame
,但它应该扩展JFrame
到覆盖其现有功能。以这种方式实现接口(interface)会导致 leaking
this
in a constructor .这使确保 Swing GUI 对象仅在 event dispatch thread 上构造和操作的问题更加复杂。 .关于 generalization ,
JFrame
是Window
的特化,用作 top-level container .不要混淆 containment hierarchy与 class hierarchy .关于 single responsibility ,
JFrame
API显示连贯推导,尽管 Swing 的 history和 cross-platform抽象。
实现一个控制接口(interface),比如ActionListener
,对于一个self-contained example来说可能很方便。 , 但一个复杂的应用程序可能需要多个 controller .使用 jmapviewer 的示例检查here .另见 Why CS teachers should stop teaching Java applets .
关于java - 继承 JFrame 违反泛化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31490620/