假设我有几个接口都是从父接口扩展而来的。父接口有一些必须由所有子接口使用的成员,所以通常我想在父接口中添加一个构造函数来设置这些公共成员。但这不能完成,因为类是接口,而不是抽象类。我不能简单地将它们更改为抽象类,因为我允许一个类实现多个接口,这是使用抽象类无法完成的。您如何解决这个问题,同时确保设计要求?
e.g。
interface Parent {
SomeCommonMember commMember;
Parent(SomeParameter para) {
// do some calculations to init commMember based on para
commMember = ...;
}
}
interface ChildA extends Parent {
void ChildAMethod();
}
interface ChildB extends Parent {
void ChildBMethod();
}
public class MyImplementation implements ChildA, ChildB {
MyImplementation(SomeParameter para) {
super(para);
};
void ChildAMethod() {
// uses commMember
};
void ChildBMethod() {
// uses commMember
};
}
public class Test {
public static void main(String[] args) {
Parent generic = new MyImplementation(new SomeParameter());
if (generic instanceof ChildA) {
generic.ChildAMethod();
}
if (generic instanceof ChildB) {
generic.ChildBMethod();
}
}
}
答案 0 :(得分:2)
如果您使用的是Java 8,则可以为界面定义default methods。 但请注意,您不能在接口级别拥有属性。所以你必须修改你的过程。
答案 1 :(得分:1)
我认为你唯一能做的就是确保Parent
接口的每个实现都有共同的成员,就是在{中定义这些公共成员的getter和setter(以及关于这些成员的其他方法){ {1}}界面。这样,您就可以确定界面的每个实现都有表示公共成员的东西,并且您可以获取它,设置它(以及您在父界面中定义为默认的其他内容)
所以你会:
Parent
在实现类中,您可以使用这些方法。你仍然会有一些打字(实现相同的方法),但这是使用接口时付出的代价...... 如果你真的不想重新输入所有那些东西,你将不得不使用抽象类并使用聚合或组合来试图“模仿”多个(抽象)类的扩展:
interface Parent {
//getter
CommonMember getCommonMember();
//setter
void setCommonMember(CommonMember newValue);
//if needed, additional mandatory method for processing common member
void processCommonMember();
}
但是你也有限制(在另一种方式上)这个选项......