2

連鎖呼び出しのメソッドを宣言する場合、通常returns thisはメソッドの最後に宣言します。

だから私は宣言します:

public class Foo {

    public Foo setTitle(String title){
        ...
        return this;
    }

}

と:

public class Bar extends Foo{

      /* OTHER STUFF */
}

呼び出すnew Bar().setTitle("Test")と、の参照が返されますFoo

明確さ、簡潔さ、保守性のためにBarのメソッドをオーバーライドせずに、Barの参照を自動的に返すためにメソッドを宣言することは可能ですか?

ありがとう

4

5 に答える 5

6

明確さ、簡潔さ、保守性のためにBarのメソッドをオーバーライドせずに、Barの参照を自動的に返すためにメソッドを宣言することは可能ですか?

いいえ。奇妙なジェネリックスFoo<T extends Foo>などを接続することもできますが、満足のいくものではありません。

基本的に、「このタイプ」の言語サポートが必要です。このタイプの有効な式はとだけnullですthis。それは存在しないので、オーバーライドする必要があります。

public Bar setTitle(String title) {
    super.setTitle(title);
    return this;
}

または:

public Bar setTitle(String title) {
    return (Bar) super.setTitle(title);
}

これは、継承が苦痛になるケースの1つにすぎません:(

于 2012-11-11T16:39:31.410 に答える
2

私はジェネリックで試しました...

public class Foo<T extends Foo> {

    public T setTitle(String title){
        .....
        return (T) this;
    }
}

public class Bar extends Foo<Bar>{

    /* OTHER STUFF */
}

動作しているようです。

于 2012-11-11T16:41:11.247 に答える
1

私はそのアクチュレイが戻ってくるBarだけだと思います。次のように、型キャストを実行してオブジェクトを参照しBarます。

    Bar bar = (Bar)(new Bar().setTitle("Foo Title"));
    System.out.println(bar.getTitle());//prints Foo Title

タイトルを返す際にgetTitle()メソッドが存在すると仮定します。Foo

たとえばクラスgetBarTitleに別のメソッドを追加する場合:Bar

      public String getBarTitle(){
          return getTitle()+" of Bar";
      }

それから

  System.out.println(bar.getBarTitle());//prints Foo Title of Bar

説明: を呼び出すsetTitlenew Bar()、メソッドはBarObjectで呼び出され、ではなくオブジェクトをthis表します。したがって、クラスタイプがスーパークラスであるとしてのみonjectを返します。このプロセスでは、元のクラスタイプ(バー)はまったく変更されない ため、型キャストが目的を果たすはずです。BarFooBarFoo

于 2012-11-11T16:41:16.817 に答える
1

ジェネリックスには上限があります。

public class Foo<T extends Foo<T>> {
    public T setTitle() {
        ...
        return (T) this;
    }
}

public class Bar extends Foo<Bar> {
    ....
}
于 2012-11-11T16:43:59.073 に答える
1

正確には、Foo参照を返しません。Bar参照を返します。System.out.println(reference.getClass()。getName())を使用して確認できます。

あなたが書くときと同じように、

List l=new ArrayList(); 

(LIstがインターフェースであることを忘れてください、それは要点の脇にあります)

lこの情報が「隠されている」場合でも、実際にはArrayListへの参照ですが、l.someMathod()を呼び出すと、ListメソッドではなくArrayListメソッドが呼び出されます。これがオブジェクト指向の仕組みです。

于 2012-11-11T16:46:06.230 に答える