限制Java中可以实现接口的类

问题描述 投票:0回答:4

在我们开始之前:我知道这个问题,就我而言,这个答案不起作用。

所以假设我有:

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 原则,或者这样做是否是糟糕代码的标志?

java oop inheritance
4个回答
3
投票

我看到的唯一选择是将接口设为包私有,并通过位于同一包中的 public

SuperClass
实现它。这样,您的包的用户将能够对
SuperClass
进行子类化,但无法直接实现您的接口。但请注意,这样界面本身就变得不是很有用,因为外面没有人可以看到它。

总的来说,似乎只需删除该接口并在各处替换为

SuperClass
即可解决您的问题。


2
投票

我相信并参考JavaDocs,无法阻止public接口被继承。根据定义,接口就是为了以这种方式工作而设计的,我们在 Java 中使用访问说明符和其他东西来创建可见性较低的接口。不过很想展示一种方法。


0
投票

虽然我绝对同意@Tagir的答案(并且相信它应该被接受),但公平地说,如果他使用自己的ClassLoader实现,可以对哪些类可以在runtime中实现哪些接口进行限制。另外,我认为如果一个人构建自己的基于 JVM 语言,这样的事情可以在编译时完成。


0
投票

在较新版本的 Java 中,“密封”类和接口正是为此目的而实现的:

https://docs.oracle.com/en/java/javase/17/language/sealed-classes-and-interfaces.html#GUID-0C709461-CC33-419A-82BF-61461336E65F

预览版首次在 Java 15 中呈现,自 Java 17 起,它们得到了完全支持。

© www.soinside.com 2019 - 2024. All rights reserved.