1

print と呼ばれる 1 つのメソッド シグネチャを持つ A と呼ばれる 1 つのインターフェイスがあるとします。A を実装する 3 つのクラスがあり、A.print を呼び出すと、どのクラス メソッドが呼び出されるかをどのように知ることができますか。オブジェクトの新規作成はありません

public interface A()
{
  public void print(){}
}
@Component
public class B implements A
{
 public void print()
 {
   system.out.print("B");
 }
}
@Component
public class c implements A
{
 public void print()
 {
   system.out.print("C");
 }
}
@Component
public class d implements A
{
 public void print()
 {
   system.out.print("d");
 }
}


public class runner()
{
    @Autowired
    private A aThing_;

    aThing_.print();
}
4

4 に答える 4

3

インターフェースは相互作用コントラクトを定義します。つまり、そのインターフェースを実装するすべてのクラスが提供するメソッドのセットを定義します。

質問に対するオラクルの答え、インターフェースとは何ですか? は:

すでに学んだように、オブジェクトは、公開するメソッドを通じて、外部世界との相互作用を定義します。メソッドは、オブジェクトと外界とのインターフェースを形成します。たとえば、テレビ セットの前面にあるボタンは、ユーザーと、プラスチック ケースの反対側にある電気配線との間のインターフェイスです。「電源」ボタンを押して、テレビの電源をオンまたはオフにします。

呼び出しは、インターフェイスを実装するオブジェクトのタイプによって異なります。

A interface = new B();

インターフェイスで定義されたメソッドBの のprintメソッドの実装を呼び出します。printA

EDIT:インターフェイスのポイントは、実際のタイプに関係なく、オブジェクトとの相互作用を定義することです。そのコードは、同じインターフェイスの背後にあるコンポーネントのグループを自動スキャンして、コンテキストが与えられた場合に、同じ状況を別の方法で処理する一連の異なるコンポーネントを定義できることを示しているようです。

私の知る限り、自動配線のデフォルトはフィールドの名前です。@Qualifier("CLASS_NAME_HERE")と一緒にアノテーションを使用して、注入するインターフェース実装を定義できます@Autowire

これを確認することをお勧めします。

于 2012-10-11T17:37:35.713 に答える
1

オブジェクトがそれを呼び出すクラスからメソッドバージョンを呼び出します

A ob = new B(); 
ob.print()// will invoke method from B


A ob = new C(); 
ob.print()// will invoke method from C

見る

于 2012-10-11T17:34:28.193 に答える
0

私たちの例を正しく理解していれば、Aを実装するオブジェクトへの参照が自動配線されるクラスRunnerがあります。

インターフェースの要点はポリモーフィズムです。言い換えると、この設計でインターフェースAを使用する目的は、ランナーがどの実装が使用されているかを知る必要がないようにすることです。ランナーが気にするのは、Aで定義されたメソッドが使用可能であるということだけです。

ある種の型情報を返すプロパティをAに設定できますが、(いくつかの例外を除いて)それは目的の一部を無効にします。

于 2012-10-11T17:42:14.797 に答える
0

そのようなオブジェクトをどのようにインスタンス化するかによって異なります:

例えば

private A aThing = new C();

C印刷メソッドを呼び出します

于 2012-10-11T17:34:56.283 に答える