Java类继承和阻塞超类方法

时间:2013-06-20 22:48:28

标签: java class inheritance superclass

我目前正在制作一个简单的可插件程序。我的问题是我不想让插件访问所有base-plugin字段/方法。例如:

public abstract class BasePlugin {
    private int x; //Mysterious x
    public abstract void update(); //update func that may need x, but can't change it
    protected final int getX() {return x;} //x accessor
}

除非你意识到没有办法设置x,否则这会有效。

我该怎么办?我想让子类(插件)无法更改x,但让它读取值。在创建时,值应该至少可以访问一次(这就足够了)。

编辑:构造函数在大多数情况下都有效,但如果我有例如:

public abstract class BasePlugin {
    private List<int> x; //Mysterious x
    public abstract void update(); //update func that may need x, but can't change it
    protected final List<int> getX() {return x;} //x accessor
    public BasePlugin(List<int> y) {x = y;}
}

public class Plugin {
    public Plugin(List<int> y)
    {
        super(y);
        y.remove(0); //Will it work?
    }
}

3 个答案:

答案 0 :(得分:2)

允许抽象类具有构造函数,因此您可以为BasePlugin创建无参数构造函数:

public abstract class BasePlugin {
    private int x; //Mysterious x
    public BasePlugin() {
        x = 42;
    }
    public abstract void update(); //update func that may need x, but can't change it
    protected final int getX() {return x;} //x accessor
}

现在,当创建一个插件时,x被设置为42.您甚至不需要对插件进行任何代码更改以使它们使用此构造函数。


要回答编辑过的问题:如果x是一个List并且您不希望插件修改它,那么构造函数应该将其复制并将其包装在unmodifiable list中。否则,任何插件都可以调用getX().add(myObject)

public BasePlugin(List<int> y) {
    List<int> temp = new ArrayList<int>();
    Collections.copy(temp, y); // shallow copy of the list
    this.x = Collections.unmodifiableList(temp);
}

现在,如果插件的构造函数是

public Plugin(List<int> y)
{
    super(y);
    y.remove(0); //Will it work?
}

它对BasePlugin的列表没有任何影响。

答案 1 :(得分:1)

您可以添加构造函数以使子类初始化您的属性:

public abstract class BasePlugin {
    private int x; //Mysterious x

    public BasePlugin(int x) {
        this.x = x;
    }

    public abstract void update(); //update func that may need x, but can't change it
    protected final int getX() {return x;} //x accessor
}

答案 2 :(得分:1)

您可以使用构造函数注入。

public abstract class BasePlugin{

  private int x;

  public BasePlugin(int x){
   this.x=x;
  }

  public abstract void update(); //update func that may need x, but can't change it
  protected final int getX() {return x;} //x accessor

}

在你的孩子身上

public class Plugin extends BasePlugin{


  public Plugin(int x){
    super(x);
  }

}