uba*_*jea 4 java inheritance final
我有以下问题.我想要一个名为MessageField的广泛抽象类型.MessageField的运行时使用是携带String值; 该类型的其余部分应该是一堆不变的定义和行为.MessageField的每个子类都应该是一组定义类型的常量最终成员,如果需要,还可以覆盖其他行为方法.
例如:
public abstract class MessageField {
//whatever needs to go here to make this work
//methods that define behavior
//e.g. public int getFieldId() { return fieldId; }
}
public class TypeOne extends MessageField {
public final int fieldId = 1; //type defining member
public final String tag = "->"; //type-defining member
public String fieldValue; //freely settable/gettable
//change any behavior if necessary
}
public class TypeTwo extends MessageField {
public final int fieldId = 2;
public final String tag = "++";
public String fieldValue;
}
public class TypeThree extends MessageField {
public final int fieldId = 3;
public final String tag = "blah";
public String fieldValue;
}
Run Code Online (Sandbox Code Playgroud)
应该强制每个子类在写入时为fieldId和tag定义一个值.我猜在概念上这些是每种类型的静态最终常量,但是它如何与继承一起工作?我需要所有各种类型以符合可以传递的一种广泛的总体类型.
也许继承不是实现这种模式的最佳方式,但如果没有,那是什么?如果继承是这样做的方式,它会怎么做?
谢谢!
将字段移动到基类并通过构造函数初始化它们:
public abstract class MessageField {
public final int fieldId;
public final String tag;
protected MessageField(int fieldId, String tag) {
this.fieldId = fieldId;
this.tag = tag;
}
public int getFieldId() {
return fieldId;
}
public String getTag() {
return tag;
}
}
public class TypeOne extends MessageField {
public String fieldValue; //freely settable/gettable
public TypeOne() {
super(1, "->");
}
}
// etc.
Run Code Online (Sandbox Code Playgroud)
既然您考虑使用存取方法,我建议制作fieldId和tag private.