对于一个项目,我编写了以下界面:
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实例可用。 (并且不应该重新分配此信号)
这是用抽象类替换接口的正当理由(并且有其附带的限制),还是有其他可能的解决方案?
答案 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。如果要为可能没有关系的类强加服务合同,则使用接口。