【问题标题】:Referencing instance variables from within abstract class从抽象类中引用实例变量
【发布时间】:2021-01-28 07:32:50
【问题描述】:

我有一个抽象类,它列出了它的每个子类应该实现的内容。大多数方法对每个子类都有不同的实现,但有些方法对所有子类都是相同的。我希望在抽象类中定义相同的方法,这样我就不会将相同的方法粘贴到几个不同的类中。但是,当我在抽象子类的实例上调用该方法时,我收到了一个空指针,因为我想抽象类中实现的方法是引用抽象的字段,而不是实例的字段。

谁能指出缺陷在哪里?

例如:

abstract class ControlView {
    String[] controls;

    abstract void render();

    void release() {
        for (int i = 0; i <= controls.length; i++) {
            //Release the controls
        }
    }
}



class StartingControls extends ControlView{

    String[] controls;
    Button uiDrawButton;
    Button uiLoadButton;


    StartingControls() {
        this.controls = new String[2];

        uiDrawButton = new Button();
        this.controls[0] = uiDrawButton;

        uiLoadButton = new Button();
        this.controls[1] = uiLoadButton;
    }


    public void render() {
        //Unique Render implementation
    
    } 
}

当我打电话时

instanceOfStartingControls.release();

我显然想遍历我在instanceOfStartingControls 的控件字段中构造时放入的两个字符串。我想要遍历显然存在于抽象中的未初始化数组。

是访问修饰符或静态方法的某种组合使其无法正常工作,还是我错过了一些关于抽象类的关键知识?这感觉像是一个基本问题,但我很难用语言表达,所以我对搜索的任何结果都不满意。

【问题讨论】:

  • 不要在你的子类中重新声明String[] controls;。它已经有一个名为controls 的字段。它不需要另一个。
  • 同时制作控件private并添加protected子类与之交互的方法。
  • @SephB 这没必要。
  • @khelwood 不,不是。不过,如果 controls 的实现在未来发生变化,它确实会有所帮助。比如它变成了一个列表。

标签: java oop abstract-class


【解决方案1】:

有两个名为controls 的数组。派生类中的 1 掩盖了基类中的 1,因此基实例永远不会设置为非空。

从派生类中删除声明。

此问题与基数为abstract 无关。如果您在派生类中使用与基类中相同的字段名称,则基类实例将被隐藏。

【讨论】:

    猜你喜欢
    • 2019-02-10
    • 1970-01-01
    • 2018-12-05
    • 1970-01-01
    • 2013-06-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多