在我们开始之前:我知道这个问题,就我而言,这个答案不起作用。
所以假设我有:
interface Iface
class SuperClass (this one is from external library and can't be changed)
class SubClass extends SuperClass
class OtherClass
有没有办法让
Iface
只能由SuperClass
及其子类实现?所以在这种情况下:
class SuperClass implements Iface - would be good if I could edit that class
class SubClass implements Iface - good
class OtherClass implements Iface - bad
附带问题:这是否违反 OOP 原则,或者这样做是否是糟糕代码的标志?
我看到的唯一选择是将接口设为包私有,并通过位于同一包中的 public
SuperClass
实现它。这样,您的包的用户将能够对 SuperClass
进行子类化,但无法直接实现您的接口。但请注意,这样界面本身就变得不是很有用,因为外面没有人可以看到它。
总的来说,似乎只需删除该接口并在各处替换为
SuperClass
即可解决您的问题。
我相信并参考JavaDocs,无法阻止public接口被继承。根据定义,接口就是为了以这种方式工作而设计的,我们在 Java 中使用访问说明符和其他东西来创建可见性较低的接口。不过很想展示一种方法。
在较新版本的 Java 中,“密封”类和接口正是为此目的而实现的:
预览版首次在 Java 15 中呈现,自 Java 17 起,它们得到了完全支持。