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

2022-09-03 09:33:49

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

所以我的问题是,有没有一个很好的/强烈的理由来解释为什么这是被禁止的?

谢谢

编辑:非常感谢所有这些答案。所以听起来这个问题没有正确或错误的答案。

假设我接受这些类不被子类化的事实,那么不将 Control 类标记为 final,而是禁止子类化 - 有效地将异常/错误从编译时降级到运行时有什么意义呢?

EDIT^2:请参阅我自己对此的回答:显然,这些类是可覆盖的,但需要覆盖者明确确认。

谢谢


答案 1

看起来没有人在任何答案中提到这一点,但SWT确实提供了一种可覆盖的方法;恰好是引发不可扩展异常的位置。将该方法重写为 no-op,并有效地使扩展合法化。我想将此选项保持打开状态最终是导致类未成为最终版本的原因,并且扩展错误未在编译时而不是运行时进行。checkSubclass()

例:

@Override
protected void checkSubclass() {
    //  allow subclass
    System.out.println("info   : checking menu subclass");
}

答案 2

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

这遵循了乔希·布洛赫(Josh Bloch)关于“为继承而设计或禁止继承”的建议。这在开发社区中是一个宗教话题 - 我同意这种观点,但其他人更喜欢所有内容都尽可能开放以进行扩展。


推荐