6

次のような 2 つのカスタム クラスとメソッドがあるとします。

class A {
  public void think() {
    // do stuff
  }
}

class B {
  public void think() {
    // do other stuff
  }
}

Class C {
  public void processStuff(A thinker) {
    thinker.think();
  }
}

次のように書く方法はありますprocessStuff()か (説明のみ):

public void processStuff({A || B} thinker) {...}

または、言い換えると、processStuff()メソッドを複数回入力することを避けるために、複数の型を受け入れる 1 つのパラメーターを持つメソッドを作成する方法はありますか?

4

5 に答える 5

14

インターフェイスで必要な動作を定義し、インターフェイスAを実装して実装し、インターフェイスのインスタンスを引数として受け取ることをB宣言します。processStuff

interface Thinker {
    public void think();
}

class A implements Thinker {
    public void think() { . . .}
}

class B implements Thinker {
    public void think() { . . .}
}

class C {
    public void processStuff(Thinker thinker) {
        thinker.think();
    }
}
于 2012-12-20T19:16:50.230 に答える
5

Thinkerインターフェイスとして定義:

public interface Thinker
{
    public void think();
}

次に、クラスAを作成してB実装します。

public class A
implements Thinker

最後に、パラメータとして aprocessStuff()を取るように定義しThinkerます。

于 2012-12-20T19:17:45.303 に答える
5

この場合、最も簡単なのはインターフェースを定義することです

interface Thinker {
   public void think();
}

次に、クラスにそれを実装させます:

class A implements Thinker {
  public void think() {
    // do stuff
  }
}

パラメータタイプとして使用します:

Class C {
  public void processStuff(Thinker t) {
    t.think();
  }
}
于 2012-12-20T19:17:15.677 に答える
1

thinkメソッドを含む共通のインターフェイスを作成し、それを実行して実装することができAますB

または、オーバーロードprocessStuff()して 2 つの実装を作成し、それぞれがいずれかのクラスを取得することもできます。

于 2012-12-20T19:17:37.667 に答える
1

この場合、単純にポリモーフィズムを使用できます。これを行うには、メソッドをオーバーロードします。つまり、同じ名前でパラメーターの型が異なるメソッドを作成します。java はメソッド名をチェックしません。メソッドのシグネチャ (メソッド名 + パラメータ + 戻り値の型) をチェックします。次に例を示します。

public class foo
{
       public int add(int a, int b)
       {
            int sum = a+b ;
            return sum ; 
       }


       public String add(String a, String b)
       {
            String sum = a+b ;
            return sum ; 
       }

       public static void main(String args[])
       {
            foo f = new foo() ;
            System.out.printf("%s\n",f.add("alpha","bet));
            System.out.printf("%d", f.add(1,2);
       }


 }

このコードは返す必要があります

alphabet
3

ご覧のとおり、2 つのメソッド シグネチャが異なるため、エラーは発生しません。これは何ができるかの単なる例であることに注意してください。

于 2012-12-20T19:29:34.990 に答える