【问题标题】:How to access (shadowing) member variables in subclass from method in superclass?如何从超类中的方法访问(隐藏)子类中的成员变量?
【发布时间】:2014-09-07 18:55:25
【问题描述】:

如果有人不明白这个问题,请告诉我。我尽力提出下面的问题。 我在父类中有一个通用的方法来生成模式。为了重用性,我想在父类下保留这个方法。

在方法内部,我使用了几个变量。所以我认为最好将对象作为参数传递给方法generatePattern。但是由于变量不能被覆盖,我怎样才能使用这些子类中的各个变量呢?除了使用子类之外,java中的任何其他功能?在这种情况下,“通用类型”作为参数是否有效?

class Parent {
    int var1;
    String[] values;

    void generatePattern(Parent obj1) {
        // This will not make use of respective values of 
        // subclass object that is passed I guess.
        newPattern(obj1.values, obj1.var1);    
    }
}

class AscendSubClass extends Parent {
    int var1 = 5;
    String[] values = {"S", "R"};
}

class DescendSubClass extends Parent {
    int var1 = 10;
    String[] values = {"N", "D"};
}

我可以将上面的 AscendSubClass 或 DescendSubClass 传递给 generatePattern()。 在这个方法中,我需要使用变量 var1、values 和许多其他子类的变量。 这些变量类型相同,名称相同,但值不同,取决于子类。我现在如何在 generatePattern() 中引用这些变量,以便该方法不会改变? 可以通过将变量作为方法的参数或通过 if/else 语句来实现这一点,但是我有几个变量要传递,这很不方便。

【问题讨论】:

    标签: java subclass member shadowing


    【解决方案1】:

    添加一个 getter 方法并在任一子类中覆盖它。

    public int getVar() {
        return var1;
    }
    

    【讨论】:

    • 我建议在Parent 中将getVargetValues 定义为protected abstract 方法。
    • 谢谢,现在可以使用了。但是在被覆盖的子类中的“return var1”语句中,它不是返回 var1 还是父级?这意味着我们可以在 getter 方法的情况下覆盖变量,但不能?我有点困惑。以下两个语句的打印方式不同: System.out.println("var1 = " + obj1.getter()); System.out.println("Var1 打印不带getter = " + obj1.var1);
    • 方法中引用的值始终是类中定义的值(继承字段或显式定义)。
    猜你喜欢
    • 1970-01-01
    • 2017-08-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-15
    • 2012-04-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多