1


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


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

4

5 回答 5

4

这取决于你的目标是什么。如果您正在验证输入,或者需要在将数据传递给超类之前对其进行处理,那么您没有做错任何事情。

只需确保您了解超类在您要覆盖的函数中所做的事情,并酌情调用或不调用它。

于 2013-07-05T06:54:23.200 回答
2

只要设计合理,就没有错。事实上,在应用了专门的操作之后调用默认行为是一种常见的做法。非常有意义,并且与 OO 原则相得益彰。

于 2013-07-05T07:00:20.297 回答
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);
  }
}
于 2013-07-05T06:58:51.503 回答
0

您可以在需要的地方调用 super,这取决于您要执行的操作。

于 2013-07-05T06:58:57.020 回答
0

我相信规则/建议对构造函数有效,但对其他方法无效。父类的构造函数需要在子类的构造函数之前调用。这将确保如果您在构造函数中调用父类的任何方法,则父类已经正确设置。

但是对于其他方法,应该已经很好地设置了父类来调用这些方法。也许不是在所有场景中,所以答案取决于你可以调用 super.methods 的场景。我看不出它有什么害处。

于 2013-07-05T06:54:58.003 回答