在父接口JAVA中解决缺少的构造函数

时间:2016-12-12 00:02:27

标签: java interface abstract-class extends implements

假设我有几个接口都是从父接口扩展而来的。父接口有一些必须由所有子接口使用的成员,所以通常我想在父接口中添加一个构造函数来设置这些公共成员。但这不能完成,因为类是接口,而不是抽象类。我不能简单地将它们更改为抽象类,因为我允许一个类实现多个接口,这是使用抽象类无法完成的。您如何解决这个问题,同时确保设计要求?

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();
        }
    }
}

2 个答案:

答案 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();
}

但是你也有限制(在另一种方式上)这个选项......