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

デザインが理にかなっている限り、それで問題はありません。実際、特殊な操作が適用された後に既定の動作を呼び出すのが一般的な方法です。完全に理にかなっており、オブジェクト指向の原則によく合います。

于 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.methods を呼び出すことができるシナリオによって異なります。そして、私はそれに何の害も見ません。

于 2013-07-05T06:54:58.003 に答える
0

必要な場所でスーパーを呼び出すことができます。これは、実行する操作によって異なります。

于 2013-07-05T06:58:57.020 に答える