指令后调用“超级”功能。这是一种不好的做法吗?

时间:2013-07-05 06:51:21

标签: language-agnostic coding-style


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


为了使我的问题清楚,我们以一个例子为例 考虑简单地向用户发送电子邮件的“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类中,我在调用/替换电子邮件地址之前调用“超级”发送功能。
因为它只是一个例子,我可能会做更多......

5 个答案:

答案 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)

您可以在所需的地方拨打超级电话,这取决于您要执行的操作。