11

私は2つの豆を作成しました

class BackPageBean{
   String backPage = null;
  :
  :
  :
}


class InformationMessageBean{
   String informationMessage = null;
  :
  :
  :
}

これで、クラスがバックページを認識している場合はbackPageBeanを拡張し、ある種のメッセージを表示する必要がある場合はInformationMessageBeanを拡張します。

class BackPageAware extends backPageBean{
}

class InfoMessAware extends InformationMessageBean{
}



    someFunction () {
       if ( theObject instanceOf backPageBean ) {
              prepareTheBackPage ( theObject.getBackPage() );
       }

       if ( theObject instanceOf InformationMessageBean ) {
              showtheInformation ( theObject.getMessage() );
       }

   }

問題は、BackPageAwareとInformationAwareの両方であるBeanが必要な場合、多重継承がないため、どのようなアプローチをとるべきかということです。

4

8 に答える 8

12

私のコメントを明確にするためだけに。

Darth Eruが言うように、2つのインターフェースと2つのデフォルトの実装を作成します。両方の動作を必要とするBeanがある場合、そのクラスは2つのインターフェースを実装しますが、デフォルトの実装の変数も作成します。このようにして、コードを複製する必要はありません。

    interface InfoMessAware {

         String getMessage();
    }

    interface BackPageAware {

         String getBackPage();
    }

class DefaultInfoMessAware {
         String getMessage() {
             return "message";
         }
}

class DefaultBackPageAware {
         String getBackPage() {
             return "backPage";
         }
}

    class MyBean implements InfoMessAware, BackPageAware {
         private InfoMessAware messAware = new DefaultInfoMessAware();
         private BackPageAware backPageAware = new DefaultBackPageAware();

         String getMessage() {
             return messAware.getMessage();
         }

         String getBackPage() {
             return backPageAware.getBackPage();
         }
    }
于 2009-06-24T15:01:50.607 に答える
12

インターフェイスを使用する:

interface InfoMessAware {

     String getMessage();
}

interface BackPageAware {

     String getBackPage();
}

class MyBean implements InfoMessAware, BackPageAware {

     String getMessage() {
         return "message";
     }

     String getBackPage() {
         return "backPage";
     }
}

次に、 instanceofを標準のメソッド呼び出しに置き換えます。

于 2009-06-24T13:27:37.830 に答える
8

あなたが説明している問題は、継承ではなく、構成の使用法を要求します。BackPageAwareであるクラスは、そのクラス/機能について認識していることを意味します。継承とは、BackPageであることを意味しますHASAの関係について説明しました。

これまで何度も言われてきたように、インターフェースを使用して、オブジェクトが持つ情報を取得するためのコントラクトを定義します

于 2009-06-24T13:45:05.893 に答える
2

元の2つのクラスは、実装が返す必要のある情報を取得するメソッドがそれぞれにあるインターフェイスである必要があります。

public interface BackPageBean {
   public String getBackPage();
}


public interface InformationMessageBean {
   public String getInformationMessage();   
}

クラスにBackPageBeanとInformationMessageBeanの両方を実装する場合は、次のようにします。

public MyBean implements BackPageBean, InformationMessageBean {

  public String getBackPage() {
    return null;
  }

  public String getInformationMessage() {
    return null;
  }
}

一般的に言って、可能な限り非抽象クラスを拡張することは避けるべきです。それはあらゆる種類の問題につながります。代わりに、具象クラスが含まれる継承の代わりに合成を使用してみてください。そうでない場合は、インターフェースと時折抽象クラスに固執してみてください。

于 2009-06-24T15:20:00.820 に答える
2

他の回答で説明されているように、多重継承は、多くの定型コードを記述しなければならないという犠牲を払って、インターフェースと構成を使用してシミュレートできます。ただし、コンパイル時(プリプロセッサ経由)または実行時(jmixinなど)にこれを自動化できるプロジェクトは数多くあります。

于 2009-11-21T13:42:28.583 に答える
1

クラスではなく、インターフェイスとして使用BackPageAwareできます。これにより、参照している「bean」がとInformationAwareである場合に、両方のインターフェースからメッセージをフェッチできます。BackPageAwareInformationAware

public class Name implements BackPageAware, InformationAware {}
于 2013-07-30T02:11:09.520 に答える
0

BackPageAwareとInformationAwareをインターフェイスとして宣言し、これらのインターフェイスを実装する抽象クラスを作成して、デフォルトの機能を提供します。2つのインターフェースのうちの1つだけである必要があるクラスは、対応する抽象クラスを継承できます。両方である必要があるクラスは、抽象クラスの1つを継承して他のインターフェースを実装することも、両方のインターフェースを実装することもできます。デフォルトの機能がない場合は、抽象クラスも必要ありません。

于 2009-06-24T13:30:30.057 に答える
0

複数のクラスを拡張することはできませんが、複数のインターフェースを実装することはできます。インターフェイスをクラスに適用する場合、クラスのオブジェクトはインターフェイスとIS-A関係にあることに注意してください。

于 2009-06-24T13:30:30.150 に答える