假设我们有一个抽象类,它定义一个带整数的构造函数,其中前置条件检查整数是否在可能的值列表中:
public abstract class Value {
protected int value;
protected static List<Integer> possibleValues;
public Value(int val) {
if (!possibleValues.contains(val))
throw new IllegalArgumentException("Illegal value");
value = val;
}
}
但我们想在Value
的子类中初始化该列表,因为每个子类都定义了自己的可能值列表。
我想我可以static
阻止将成员添加到possibleValues
,但我不喜欢static
个阻止。但这并不意味着所有子类都会停止指向可能值的相同列表。
如何强制子类定义可能值列表并执行前置条件检查而不会遇到我描述的问题?
编辑:所以我们可以说我想继承行为而不是变量本身。
答案 0 :(得分:2)
怎么样:
public abstract class Value {
protected int value;
protected abstract List<Integer> getPossibleValues();
public Value(int val) {
if (!getPossibleValues().contains(val))
throw new IllegalArgumentException("Illegal value");
value = val;
}
}
您的子类将被强制实施getPossibleValues()
。
答案 1 :(得分:0)
如下:
public abstract class Value {
int value;
protected Value(int val, List<Integer> possibleValues) {
if (!possibleValues.contains(val)) {
throw IllegalArgumentException();
}
this.value = val;
}
}
class SubValue extends Value {
private static final List<Integer> possibleValues = ...;
SubValue(int val) {
super(val, possibleValues);
}
}