3

有什么理由从超类调用方法吗?

我遇到了很多super调用方法而不是this方法的地方,例如:

public String getCustomValue() {
    String value = (String) super.getValue(someArgHere);
    return value;
}

有什么好处吗?我只看到了继承的一个主要问题:如果我getValue在这个类或其后代之一中getCustomValue重写将忽略该重写和调用super方法。

4

6 回答 6

2

super.getValue(someArgHere)调用getValue超类的方法。相反,this.getValue(someArgHere)调用getValue当前类的方法(如果已定义)。如果当前类没有覆盖getValue,则调用超类方法。

于 2012-11-24T21:39:27.860 回答
2

除非您重写了该方法getValue(...)并且您确实确定(您的确定性值得在代码中添加注释)您想要绕过它,否则您不应该super像现在这样使用它。稍后,如果您或其他人决定覆盖getValue(...),他们可能希望效果也适用getCustomValue()

虽然您绝对可以调用super.myMethodOne()from myMethodTwo(),但通常的情况是当您想要调用super.myMethodOne()frommyMethodOne()时覆盖它。像 Ruby 这样的一些语言甚至会自动为您传递方法参数,这样您就不必重新输入它们。

这是一个例子:

public class A {
    public void close() {

      // do a bunch of things...
    }
}

public class B extends A {
    @Override
    public void close() {
        // close things related to the subclass B
        // and then make sure A is closed as usual...
        super.close();
    }
}
于 2012-11-25T03:16:57.933 回答
1

在方法未被覆盖的情况下,使用superover没有任何技术优势。this

但是,有人可能会说使用它更清晰,super而不是this因为您刚才提到的原因。如果您在子类中覆盖该函数,那么您将需要使用super; 如果你不这样做,你可以使用this. 与其玩猜谜游戏(或强迫人们检查该方法是否已被覆盖),不如总是super在你的意思时使用super.

于 2012-11-24T21:38:59.563 回答
1

我只看到了继承的一个主要问题:如果我getValue在这个类或其后代之一中getCustomValue覆盖将忽略该覆盖并调用超级方法。

然后不要super显式调用该方法,只需调用getValue. 如果该方法没有被覆盖,它将默认为超级方法。如果有,它将使用覆盖的方法。

我不知道在这种情况下询问“好处”是否合适——这真的取决于你到底想要完成什么。

于 2012-11-24T21:40:26.870 回答
0

关键是设计。当我们编码时,我们按照它是什么来做的!所以即使getValue是扩展的,它也是完美的,因为这是你的班级应该做的。

通常,super用于从 中获取任何信息或数据或副作用,super type并根据您当前的类功能对其进行修改或改进

于 2012-11-24T21:40:10.010 回答
0

唯一的好处是,如果您的类覆盖了超类的方法,您仍然可以使用super.

于 2012-11-24T21:57:48.647 回答