2015-10-08 52 views
1

在我们开始之前:我知道this question,在我的情况下,答案将不起作用。限制可以实现Java接口的类

所以我们可以说我有:

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

+0

如果最终限制'Iface'的可能实现,它可能表明您尝试使用_wrong_工具来解决您的问题。 – Spotted

+0

@斑点嗯,也许我是。我只是试图限制它只适用于它的类。 Iterable对于集合是有意义的,但对整数或PrintWriter没有意义。在我的例子中,'Iface'接口只对'SuperClass'的子类有意义,但我想保留它作为一个接口。如果我让他们类,我不能使用多重继承。如果不是'Iface',我会拥有'Iface1','Iface2'和'Iface3',这意味着要制作7个不同的类并扩展它们,而不是扩展'SuperClass'并添加所需的任何接口。 – CypherAJ

+0

当然,'PrintWriter'实现'Iterable'是没有意义的。但是这会对“Iterable”接口的可见性/可访问性产生影响吗?当然不是,因为只要合同满了(=提供了接口方法的实现),每个人都应该被允许实现一个接口。 – Spotted

回答

3

我看到的唯一选择是使接口包专用,并通过位于相同包中的公共SuperClass来实现它。通过这种方式,您的软件包的用户将能够继承SuperClass的子类,但无法直接实现您的界面。请注意,虽然这种方式界面本身变得不是很有用,因为外界没人能看到它。

通常情况下,您的问题似乎可以通过删除接口并用SuperClass替换它到处解决。

+0

刚刚发生在我身上,我没有提到我无法修改SuperClass,因为它来自外部库。我会适当地编辑问题 – CypherAJ

+0

然后做Tagir写的,但是对于子类而不是超类。 – Tom

2

我相信并指JavaDocs,A public接口不能被继承。根据定义,接口被设计为以这种方式工作,并且我们在Java中具有访问说明符和东西来使界面的可见性更低。我很想展示一种方式。

0

虽然我绝对同意@ Tagir的答案(并认为它应该被接受),是公平的一个可以对可以实现哪些类的限制,如果他用自己的执行ClassLoader什么接口在运行。另外,如果创建自己的JVM-based语言,我认为这样的事情可以在编译时完成。