强制构造函数签名是使用抽象类而不是接口的正当理由吗?

时间:2016-11-25 11:54:45

标签: java interface abstract-class

对于一个项目,我编写了以下界面:

public interface IManipulation {
    void applyManipulation (double value);
}

由于我想强制所有实现类使用某个构造函数签名,我一直在考虑将接口更改为类似下面的抽象类:

编辑:我忘记了不可能有一个抽象的构造函数,所以我稍微改了一下“解决方案”)

public abstract class Manipulation {
    private Signal signal;

    public Manipulation (Signal signal) {
        this.signal = signal;
    }

    public abstract void applyManipulation (double value);

    protected Signal getSignal () {
        return signal;
    }
}

想要强制使用此构造函数的原因是因为每个实现都应该有一个Signal实例可用。 (并且不应该重新分配此信号)

这是用抽象类替换接口的正当理由(并且有其附带的限制),还是有其他可能的解决方案?

3 个答案:

答案 0 :(得分:1)

而不是抽象类,你应该为此目的使用init方法。

public interface MyInterface{
    public void init(YourParam p);
    //... other methods
}

在init中检查,如果该类已经初始化,如果是,则返回。

所以你还有一个接口,可以从其他类扩展。 您将调用init方法进行初始化

,而不是构造函数

修改

public interface IManipulation {
    void init(Signal s);
    void applyManipulation (double value);
}

如果您有实现细节,那么您应该只使用抽象类,这些细节由所有子类共享。对于Method签名,使用接口

答案 1 :(得分:0)

您可以在抽象类中将空构造函数设为私有:

public static void main(String[] args) {


    // Will not work
    //Manipulation m = new Manipulation();

    // This one will
    Manipulation m = new Manipulation(1);
}

然后:

{{1}}

答案 2 :(得分:0)

您不应该出于技术原因而选择逻辑,即当您对子类进行实现时使用抽象类,例如person:student,teacher。如果要为可能没有关系的类强加服务合同,则使用接口。