提问人:Martin Magakian 提问时间:7/5/2013 最后编辑:It'sNotALie.Martin Magakian 更新时间:7/5/2013 访问量:102
指令后调用“super”函数。这是一种不好的做法吗?
Calling "super" function after instruction. Is it a bad practice?
问:
每次,在每种语言中,当我在调用“超级”函数之前覆盖类函数并处理指令时,我都觉得有些不对劲。
但我不知道是什么!这只是一种不好的感觉。
你们认为这是一个不好的做法吗?阅读我的代码的人会感到困惑吗?
为了把我的问题说清楚,让我们举个例子。
考虑“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 = "[email protected]";
}
super.send(emailBody);
}
}
在 InCompanyEmailSender 类中,我在调用“超级”发送函数之前检查/替换电子邮件地址。
由于这只是一个例子,我可能会做更多的事情......
答:
4赞
William Morrison
7/5/2013
#1
这取决于你的目标是什么。如果你正在验证输入,或者需要在将数据传递给超类之前对其进行处理,那么你没有做错任何事情。
只要确保你了解超类在你所重写的函数中正在做什么,并适当地调用或不调用它。
0赞
Juned Ahsan
7/5/2013
#2
我相信规则/建议对构造函数有效,但对其他方法无效。父类的构造函数需要在子类的构造函数之前调用。这将确保在构造函数中对父类调用任何方法时,父类已正确设置。
但对于其他方法,父类应该已经设置好以调用这些方法。也许不是在所有场景中,所以答案取决于你可以调用 super.methods 的场景。而且我看不出有什么坏处。
1赞
Norwæ
7/5/2013
#3
在调用 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);
}
}
0赞
Siva V
7/5/2013
#4
您可以在您需要的地方呼叫超级,这取决于您要执行的操作。
2赞
SomeWittyUsername
7/5/2013
#5
只要设计有意义,它就没有错。事实上,在应用专用操作后调用默认行为是一种常见的做法。非常有意义,并且符合OO原则。
评论