我需要开发只能实现一次的界面。如果其他类尝试在同一个项目中实现相同的接口,则不应该允许它或给出错误。
interface A {
void someMethod();
}
class B implements A {
void someMethod() {
// implementation here
}
}
现在我想限制其他类来实现接口A
class c implements A { //this should not allowed in this project
}
是否有可能开发这种界面?任何人都可以建议,我怎样才能实现这一目标?
答案 0 :(得分:3)
简单回答,如果你的界面是公共/包受保护的,那就不可能了。
答案 1 :(得分:2)
这违背了界面的目的。如果你只有一个实现,它也可能是具体的。
接口意味着由多个类实现。这允许您切换实现,而不必担心其实现细节。例如,接口最常见的用途是使用集合框架,尤其是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概念:encapsulation和polymorphism。如果您不打算使用界面来完成这两件事之一,请不要使用界面。只需使用具体(非抽象)类。此时使用界面是过度的。
我能想到的唯一例外是当你想要使用Java的Proxy
类时。只有这样才能接受1:1的接口:类比率,因为你必须有一个接口来将实现包装在Proxy
实例中。
答案 2 :(得分:1)
听起来您的设计是错误的,并且您的界面实际上应该只是class B
的一部分。
接口的意义在于它允许同一组方法的不同实现,您在此尝试避免这些方法。
答案 3 :(得分:0)
将interface A
与class B
放在同一个套餐中。
所有不应该实现A
的类都应该在这个包之外。
答案 4 :(得分:0)
了解A
实施的唯一全球方式是,如果他们向您注册,这是毫无意义的,您可以忘记这一点。
我不确定您是否要求与您合作的A
的所有实例都有Object.class
之外的公共类,或者他们的类是相同的,或者他们的类是{{ 1}}。
无论您要强制执行什么,您都需要针对B.class
的实例测试不合适的情况,但是您与A
的实例无法合作反正。
或者,对于您传递的A
的每个实例,您可以创建一个新的A
并从传递的B
中插入所需的数据。
但首先,你应该考虑为什么你想要这个,当有A
的不同实现时,它可能不是真正的问题。