我可以设置必需的属性(抽象属性)

时间:2018-04-06 12:02:47

标签: java oop abstract-class superclass

子类需要来定义一些属性。

我可以写一些像

这样的东西吗?
new SubClass(entity).operate()

现在,调用this.action.doVoidMethod()AbstractSuperClass吗?

我的“问题”是action没有(它不能)定义属性<svg width="1000" height="250"> <rect width="150" height="150" fill="orange"> <animate attributeName="x" from="0" to="300" dur="3s" fill="freeze" repeatCount="2"/> </rect> </svg>,但是子类必须定义它。

1 个答案:

答案 0 :(得分:0)

Java中没有抽象字段(why?)。如果基类希望有一个字段,它必须声明它;所有子类都将继承该字段。如果需要,可以声明受保护的抽象方法以使用该字段,需要在每个子类中进行覆盖:

abstract class MyBaseAbstract {
    protected abstract Action getAction();
    protected abstract void setAction(Action a);
}

class MyDerived extends MyBaseAbstract {
    private Action action;
    protected Action getAction() { return action; }
    protected void setAction(Action a) { action = a; }
}

这样每个子类将决定如何存储Action字段。它可能决定不直接存储字段,提供抽象级别。

按照您描述的方式初始化受保护的成员很好。但是,在子类仅在构造函数中指定特定字段但在此之后从不直接访问它的情况下,更好的方法是提供一个受保护的构造函数,该构造函数获取字段的值,并使该字段为私有:

abstract class AbstractSuperClass {
    protected Entity entity;
    private Action action;

    protected AbstractSuperClass(Entity entity, Action action) {
        this.entity = entity;
        this.action = action;
    }

    public void operate() {
        this.action.doVoidMethod();
    }
}

public class SubClass extends AbstractSuperClass {
    public SubClass(Entity entity) {
        super(entity, new Action());
    }
}
  

调用new SubClass(entity).operate()this.action.doVoidMethod()

现在从字段声明中删除了abstract,代码将按预期编译并调用doVoidMethod