有什么理由从超类调用方法吗?
我遇到了很多super
调用方法而不是this
方法的地方,例如:
public String getCustomValue() {
String value = (String) super.getValue(someArgHere);
return value;
}
有什么好处吗?我只看到了继承的一个主要问题:如果我getValue
在这个类或其后代之一中getCustomValue
重写将忽略该重写和调用super
方法。
有什么理由从超类调用方法吗?
我遇到了很多super
调用方法而不是this
方法的地方,例如:
public String getCustomValue() {
String value = (String) super.getValue(someArgHere);
return value;
}
有什么好处吗?我只看到了继承的一个主要问题:如果我getValue
在这个类或其后代之一中getCustomValue
重写将忽略该重写和调用super
方法。
super.getValue(someArgHere)
调用getValue
超类的方法。相反,this.getValue(someArgHere)
调用getValue
当前类的方法(如果已定义)。如果当前类没有覆盖getValue
,则调用超类方法。
除非您重写了该方法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();
}
}
在方法未被覆盖的情况下,使用super
over没有任何技术优势。this
但是,有人可能会说使用它更清晰,super
而不是this
因为您刚才提到的原因。如果您在子类中覆盖该函数,那么您将需要使用super
; 如果你不这样做,你可以使用this
. 与其玩猜谜游戏(或强迫人们检查该方法是否已被覆盖),不如总是super
在你的意思时使用super
.
我只看到了继承的一个主要问题:如果我
getValue
在这个类或其后代之一中getCustomValue
覆盖将忽略该覆盖并调用超级方法。
然后不要super
显式调用该方法,只需调用getValue
. 如果该方法没有被覆盖,它将默认为超级方法。如果有,它将使用覆盖的方法。
我不知道在这种情况下询问“好处”是否合适——这真的取决于你到底想要完成什么。
关键是设计。当我们编码时,我们按照它是什么来做的!所以即使getValue
是扩展的,它也是完美的,因为这是你的班级应该做的。
通常,super
用于从 中获取任何信息或数据或副作用,super type
并根据您当前的类功能对其进行修改或改进
唯一的好处是,如果您的类覆盖了超类的方法,您仍然可以使用super
.