设置值以从子类抽象私有字段
Setting value to abstract private field from subclass
我想知道从子类中为抽象私有字段设置值的最有效方法。因此,例如,有一个名为itemCost
的字段,那么我想在子类中将其值初始化为200。
Java中没有这样的抽象私有字段。只有 classes 和方法可以是抽象的。但是要模拟一个抽象域,我相信至少有两个好的方法:
- 方法 (1): 在superclass中定义一个未初始化的
final field
。并在子 class 中对其进行初始化。这更适合常量(原始)变量,并且在构造函数中初始化变量非常好。它当然也适用于复杂类型(class 具有可变内容的实例,而不是原始类型)。
- Method (2): 为字段定义一个
abstract setter
,强制subclass implement/redefine 这个方法并做具体的初始化。这更适合于变化的字段内容,但不能保证该字段将被所有子 class 正确初始化。这变得依赖于实现。
方法(1)
abstract class MySuperClass {
final int itemCost;
protected MySuperClass(int _itemCost) {
this.itemCost = _itemCost;
}
}
class MySubClass extends MySuperClass {
public MySubClass() {
super(200);
}
public MySubClass(int itemCost) {
super(itemCost);
}
}
如果您不调用 super(itemCost)
,您将遇到编译器错误。所以这是非常强制的。
方法(2)
abstract class MySuperClass {
int itemCost;
protected MySuperClass() { }
abstract void setItemCost();
abstract void setItemCost(int _itemCost);
}
class MySubClass extends MySuperClass {
public MySubClass() {
setItemCost();
}
public MySubClass(int itemCost) {
setItemCost(itemCost);
}
@Override
final void setItemCost() {
this.itemCost = 200;
}
@Override
final void setItemCost(int _itemCost) {
this.itemCost = _itemCost;
}
}
如果您有兴趣在实例化后修改值,并且如果子 class 正确实现,那么这是一个很好的解决方案。但这是一个更冗长、更不直观且容易出错的解决方案。
我想知道从子类中为抽象私有字段设置值的最有效方法。因此,例如,有一个名为itemCost
的字段,那么我想在子类中将其值初始化为200。
Java中没有这样的抽象私有字段。只有 classes 和方法可以是抽象的。但是要模拟一个抽象域,我相信至少有两个好的方法:
- 方法 (1): 在superclass中定义一个未初始化的
final field
。并在子 class 中对其进行初始化。这更适合常量(原始)变量,并且在构造函数中初始化变量非常好。它当然也适用于复杂类型(class 具有可变内容的实例,而不是原始类型)。 - Method (2): 为字段定义一个
abstract setter
,强制subclass implement/redefine 这个方法并做具体的初始化。这更适合于变化的字段内容,但不能保证该字段将被所有子 class 正确初始化。这变得依赖于实现。
方法(1)
abstract class MySuperClass {
final int itemCost;
protected MySuperClass(int _itemCost) {
this.itemCost = _itemCost;
}
}
class MySubClass extends MySuperClass {
public MySubClass() {
super(200);
}
public MySubClass(int itemCost) {
super(itemCost);
}
}
如果您不调用 super(itemCost)
,您将遇到编译器错误。所以这是非常强制的。
方法(2)
abstract class MySuperClass {
int itemCost;
protected MySuperClass() { }
abstract void setItemCost();
abstract void setItemCost(int _itemCost);
}
class MySubClass extends MySuperClass {
public MySubClass() {
setItemCost();
}
public MySubClass(int itemCost) {
setItemCost(itemCost);
}
@Override
final void setItemCost() {
this.itemCost = 200;
}
@Override
final void setItemCost(int _itemCost) {
this.itemCost = _itemCost;
}
}
如果您有兴趣在实例化后修改值,并且如果子 class 正确实现,那么这是一个很好的解决方案。但这是一个更冗长、更不直观且容易出错的解决方案。