指令后调用“super”函数。这是一种不好的做法吗?

Calling "super" function after instruction. Is it a bad practice?

提问人:Martin Magakian 提问时间:7/5/2013 最后编辑:It'sNotALie.Martin Magakian 更新时间:7/5/2013 访问量:102

问:


每次,在每种语言中,当我在调用“超级”函数之前覆盖类函数并处理指令时,我都觉得有些不对劲。
但我不知道是什么!这只是一种不好的感觉。
你们认为这是一个不好的做法吗?阅读我的代码的人会感到困惑吗?


为了把我的问题说清楚,让我们举个例子。
考虑“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 类中,我在调用“超级”发送函数之前检查/替换电子邮件地址。
由于这只是一个例子,我可能会做更多的事情......

与语言无关的 编码风格

评论

0赞 It'sNotALie. 7/5/2013
这取决于功能。

答:

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原则。