![](/img/trans.png)
[英]Method Reference Using An Interface (Implemented By More Than One Class) As A Type
[英]how to restrict java interface to be implemented in more than one class
我需要开发只能实现一次的接口。 如果其他类尝试在同一个项目中实现相同的接口,则不应该允许它或给出错误。
interface A {
void someMethod();
}
class B implements A {
void someMethod() {
// implementation here
}
}
现在我想限制其他类来实现接口A.
class c implements A { //this should not allowed in this project
}
是否有可能开发这种界面? 任何人都可以建议,我怎样才能实现这一目标?
简单的回答,如果你的界面是公共/包受保护的,那就不可能了。
这违背了界面的目的。 如果你只有一个实现,它也可能是具体的。
接口意味着由多个类实现。 这允许您切换实现,而不必担心其实现细节。 例如,接口最常见的用途是集合框架,特别是List
, Set
和Map
。
// Hides the implementation details of ArrayList within a List variable
List<String> strs = new ArrayList<String>();
// Hides the implementation details of LinkedList within the same List variable
strs = new LinkedList<String>();
// All code using strs is agnostic to what kind of list it is (mostly)
strs.add("Hello, Dolly");
System.out.println(strs.get(0));
接口主要包含两个OOP概念: 封装和多态 。 如果您不打算使用界面来完成这两件事之一,请不要使用界面。 只需使用具体(非抽象)类。 此时使用界面是过度的。
我能想到的唯一例外是当你想要使用Java的Proxy
类时。 只有这样才能接受1:1的接口:类比率,因为你必须有一个接口来封装Proxy
实例中的实现。
听起来你的设计是错误的,你的界面实际上应该只是class B
一部分。
接口的意义在于它允许同一组方法的不同实现,您在此尝试避免这些方法。
将您的interface A
与class B
放在同一个包中。
所有不应该实现A
的类都应该在这个包之外。
了解A
实现的唯一全局方式是,如果他们向您注册,这是毫无意义的,您可以忘记这一点。
我不确定你是否要求你使用的所有A
实例都有一个除了Object.class
之外的公共类,或者它们的类是相同的,或者它们的类是B.class
。
无论你想要强制执行什么,你都需要测试你传递的A
实例的不良情况,你没有与A
实例无关的事情。
或者,对于A
每个实例,您都可以创建一个新的B
并从传递的A
插入所需的数据。
但首先,你应该考虑为什么你想要这个,当有不同的A
实现时,它可能不是真正的问题。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.