【问题标题】:Calling "super" function after instruction. Is it a bad practice?指令后调用“超级”函数。这是一个坏习惯吗?
【发布时间】:2013-07-05 06:51:21
【问题描述】:


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


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

【问题讨论】:

  • 这取决于功能。

标签: language-agnostic coding-style


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案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);
        }
      }
      

      【讨论】:

        【解决方案4】:

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

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

        【讨论】:

          【解决方案5】:

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

          【讨论】:

            猜你喜欢
            • 2023-01-05
            • 1970-01-01
            • 2010-09-11
            • 1970-01-01
            • 1970-01-01
            • 2021-03-15
            • 1970-01-01
            • 1970-01-01
            • 2014-04-01
            相关资源
            最近更新 更多