首页 > 解决方案 > Setting value to abstract private field from subclass

问题描述

I would like to know about the most efficient way to set a value to an abstract private field from a subclass. So, for example, have a field called itemCost, then I would like to initialize its value to 200 in the subclass.

标签: javaabstract-classsubclass

解决方案


Java 中没有这样的抽象私有字段。只有类和方法可以是抽象的。但是要模拟一个抽象的领域,我相信至少有两种好的方法:

  • 方法 (1):在超类中定义一个未初始化final field的。并在子类中初始化。这更适合常量(原始)变量,并且在构造函数中初始化变量非常好。当然,它也适用于复杂类型(具有可变内容的类实例,而不是原始类型)。
  • 方法 (2):为字段定义一个abstract setter强制子类实现/重新定义该方法并进行特定初始化。这更适合变化的字段内容,但不能保证该字段将被所有子类正确初始化。这变得依赖于实现。

方法(一)

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),你会得到一个编译器错误。所以这是非常强制的。

方法(二)

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;
    }        
}

如果您有兴趣在实例化后修改值并且正确实现了子类,那么这是一个很好的解决方案。但它是一种更冗长、更不直观且容易出错的解决方案。


推荐阅读