[英]java explicitly call super method
有没有理由从超级班级调用方法?
我遇到过很多地方调用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()
。
虽然你绝对可以从myMethodTwo()
调用super.myMethodOne()
,但通常的情况是你想要在覆盖它时从myMethodOne()
调用super.myMethodOne()
。 像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
过this
在方法不覆盖的情况。
但是,有人可能会说,出于你刚刚提到的原因,使用super
而不是this
更清楚。 如果覆盖子类中的函数,则需要使用super
; 如果你不这样做,你可以使用this
。 而不是玩猜谜游戏(或迫使人们检查方法是否已被重写),你可以随时使用super
当你的意思是super
。
我只看到继承的一个主要问题:如果我在此类或其中一个后代中覆盖
getValue
,则getCustomValue
将忽略该覆盖并调用super方法。
然后不要显式调用super
方法,只需调用getValue
。 如果方法尚未被覆盖,则默认为超级方法。 如果有,它将使用overriden方法。
我不知道在这种情况下询问“好处”是否合适 - 这实际上取决于你究竟想要完成什么。
事情是设计。 当我们编码时,我们按照它是什么做的! 因此,即使getValue
被扩展,它也是完美的,因为这是你的课程所要做的。
通常,使用super
来从super type
获取任何信息或数据或副作用,并根据您当前的类功能修改或改进它
唯一的好处是如果你的类重写了超类的方法,你仍然可以使用super
调用超类的方法。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.