6

インターフェイスBを実装する具象クラスAがあります。

B ref = new A();

コード:

public interface B{
  public abstract String[] getWords();
}

public class A implements B {
  private String[] words = new String[] {};
  public void setWords(String[] words){
    this.words = words;
  }
  public String[] getWords(){
    return this.words;
  }
 }

インターフェイスBでは、クラスAにはゲッターメソッドがありますが、セッターメソッドはありません。

だから私がこれを行うとき:B ref = new A();、このコードは機能し、どのように単語を設定しますか?

4

5 に答える 5

5

setWordsとして定義されている場合、refを呼び出すことはできませんB ref = ...

これは、変数を宣言する(またはキャストを使用する)ときに正確な型を使用する必要がある場合の1つです。

A ref = new A();

または:

  • Bを拡張し、両方のメソッドを含み、AにCを実装させるインターフェイスCを作成できます。
  • String[] wordsフィールドを初期化するための引数を取るコンストラクターをAにwords提供し、セッターをまったく提供しないようにすることができます。

私は個人的に後者のオプションを好みます:

public class A implements B {

    private final String[] words;

    public A(String[] words) {
        this.words = words;
    }

    public String[] getWords() {
        return this.words;
    }
}
于 2012-12-19T10:50:42.943 に答える
5

したがって、これを行うと:B ref = new A();、このコードは機能しますか...

はい、そうなります。

...そしてどのように単語を設定しますか?

次の場合を除いて、次のことはできません。

  1. Aのコンストラクターに単語のリストを取得させます。また
  2. setWords()に追加B; また
  3. Aオブジェクトへの型の参照を保持します。また
  4. refにダウンキャストA

これらのうち、オプション1〜3のいずれかを使用します。最後のオプションは、完全を期すためにのみ含まれています。

于 2012-12-19T10:51:27.273 に答える
4

インターフェイスが元のタイプを公開している場合は、元のタイプにキャストバックする必要があります

if (ref instanceof A)
   ((A) ref).setWords(words);
else
   // something else.

より良い解決策は、メソッドをインターフェースに追加することです。

于 2012-12-19T10:51:53.717 に答える
3
B ref = new A();//1
ref.setWords(whatever);//2

上記のコードはsetWords()、で定義されていないためコンパイルされませんinterface B。2行目でコンパイラエラーが発生します。

他の人がすでに彼らの答えで表現しているように。回避策として2つのオプションがあります

  • オブジェクトをAref= A();として作成します。
  • refを((A)ref).setWords(watever);のようなAタイプにダウンキャストします。
于 2012-12-19T10:51:31.400 に答える
0

したがって、これを行うと:B ref = new A();、このコードは機能しますか

はい

どうやって言葉を設定しますか?

それはいけません。インターフェイスにsetterメソッドが必要です。

その間では、メソッドを抽象として定義する必要はありません。デフォルトでは抽象です。

于 2012-12-19T10:53:29.007 に答える