【问题标题】:Use property from child in super class在超类中使用孩子的财产
【发布时间】:2014-10-07 16:11:53
【问题描述】:

在我的孩子课上,我得到了类似的东西:

protected String[] columns = {"column1", "column2"};

在我的父类中,我有一个方法可以将它们存储在 HashMap 中。

public HashMap<Integer, String> getColumns() {
    HashMap<Integer, String> columnsMap = new HashMap<>();
    for (int i = 0; i < this.columns.length; i++) {
        columnsMap.put(i + 1, this.columns[i]);
    }
    return columnsMap;
}

但看起来,我不能简单地在我的子类上使用String[] columns 属性。 我怎么能做到这一点?

【问题讨论】:

  • 我相信您的选择是使用 Singleton 或 Multiton,或者使其成为抽象方法,在父级中返回 String[] 并从子级返回 String[]
  • 如果您将 Super 类设为 Abstract,您将如何访问此结果(来自子类的值)。你如何调用 getColumns() 方法。只想知道这可能有用的场景。 (假设您使用已接受的答案)

标签: java arrays oop


【解决方案1】:

创建一个抽象方法,该方法将检索包含列名的字符串数组,然后在您的子类中定义它。

在父级中:

protected abstract String[] getColumnNames();

public HashMap<Integer, String> getColumns() {
    HashMap<Integer, String> columnsMap = new HashMap<>();
    String[] columns = this.getColumnNames(); 
    for (int i = 0; i < columns.length; i++) {
         columnsMap.put(i + 1, columns[i]);
    }
return columnsMap;

}

在孩子中:

protected String getColumnNames()
{
     return new String[] {"column1", "column2"};
}

【讨论】:

  • 添加一些解释并删除重复的签名getColumns() 然后值得+1 :-)
【解决方案2】:

假设您试图从父类中的方法访问子类中定义的String[],您可以通过getColumnNames() 之类的方法访问它。子类需要重写该方法,返回定义为变量的String[]

请注意,与方法覆盖不同,在子类中声明另一个具有相同名称的字段并不等于覆盖。超类变量值保持不变,子类字段变为另一个字段。字段永远不会被覆盖,只有方法会被覆盖。

【讨论】:

  • 但是如果我在我的父母中实现 public abstract String[] getColumns(); ,我必须重命名我当前的 getColumns() 方法,对吗?
  • 是的,我刚刚在你编辑之前实现了 getColumnNames() 抽象方法。谢谢你!
  • 我编辑了我的答案,想法是有一个方法来返回String[],你可以称之为'getColumnNames()'父类可以调用这个方法。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-11-30
  • 2018-12-30
  • 2019-04-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多