每次和每种语言,当我覆盖一个类函数和处理指令之前称之为“超级”函数时,我觉得有些不对劲。
但我不知道是什么!这只是一种不好的感觉
你们认为这是一种不好的做法吗?阅读我的代码的人会感到困惑吗?
为了使我的问题清楚,我们以一个例子为例 考虑简单地向用户发送电子邮件的“SendEmail”类。
public class UserEmailSender {
public String sendTo;
public Boolean isDeveloper;
public void send(String emailBody){
System.out.println("let's send an email to"+sendTo);
}
}
现在我要覆盖这个类,以确保所有电子邮件都在我公司内发送。
public class InCompanyEmailSender extends UserEmailSender{
@Override
public void send(String emailBody){
if(! sendTo.endsWith("@myCompany.com")){
sendTo = "me@myCompany.com";
}
super.send(emailBody);
}
}
在InCompanyEmailSender类中,我在调用/替换电子邮件地址之前调用“超级”发送功能。
因为它只是一个例子,我可能会做更多......
答案 0 :(得分:4)
这取决于您的目标。如果您正在验证输入,或者需要在将数据传递给超级类之前按摩数据,那么您没有做错任何事。
请确保您了解超级类在您覆盖的函数中正在执行的操作,并在适当时调用或不调用它。
答案 1 :(得分:2)
只要设计有意义,它就没有任何问题。实际上,通常的做法是在应用专门操作后调用默认行为。具有完美的意义,并与OO原则相吻合。
答案 2 :(得分:1)
在调用super之前处理没有错。根据您的子类,您可能希望自己处理某些情况,或者预处理某些数据:
考虑:
public class Widget {
//...
}
public class Foo {
public void handleWidget(Widget aWidget) {
if (aWidget.isCompressed() {
fail()
}
// ...
}
}
public class Bar extends Foo {
public void handleWidget(Widget aWidget) {
if (aWidget.isCompressed()) {
Compression.decompress(aWidget);´
}
super.handleWidget(aWidget);
}
}
答案 3 :(得分:0)
我认为规则/推荐对于构造函数有效,但对其他方法则无效。需要在子类'构造函数之前调用父类的构造函数。这将确保如果在构造函数中调用父类的任何方法,则父类已经正确设置。
但是对于其他方法,父类应该已经设置好以调用方法。也许不是在所有场景中,所以答案取决于您可以调用super.methods的场景。而且我没有看到任何伤害。
答案 4 :(得分:0)
您可以在所需的地方拨打超级电话,这取决于您要执行的操作。