为什么许多SWT控件不允许子类化?

RAY*_*RAY 14 java swt

我经常发现自己想要这样做.当您想要存储一些有用的信息或额外的状态时,它会非常有用.

所以我的问题是,是否有一个非常好的/强有力的理由为什么这是被禁止的?

谢谢

编辑:非常感谢所有这些答案.所以听起来对此没有正确或错误的答案.

假设我接受这些类不是子类的事实,那么标记Control类的最终结果是什么,但是禁止子类化 - 有效地将异常/错误从编译时降级到运行时?

编辑^ 2:看到我自己的答案:显然,这些类是可重写的,但需要由覆盖者明确确认.

谢谢

RAY*_*RAY 20

它看起来没有任何人在任何答案中提到这一点,但SWT确实提供了一个可重写的checkSubclass()方法,并且正是抛出Unextenable异常的地方.要强制覆盖,您可以将方法覆盖为无操作,并有效地扩展合法性.我想让这个选项保持打开最终是因为该类没有成为最终的并且扩展错误没有编译时而不是运行时.


Jon*_*eet 10

为继承设计组件很难,并且可以限制将来的实现更改(当然,如果您保留一些可覆盖的方法,并从其他方法调用它们).禁止子类化限制用户,但意味着编写健壮的代码更容易.

这遵循Josh Bloch关于"继承设计或禁止设计"的建议.这在开发社区中是一个宗教话题 - 我同意这种观点,但是其他人更喜欢一切尽可能地开放.