簡體   English   中英

鏈接在Java中調用對象和繼承

[英]Chained calls to an object and inheritance in Java

在為鏈式調用聲明方法時,通常會在方法結束時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中的方法

謝謝

為了清晰,簡潔和可維護性,是否可以聲明方法以自動返回Bar的引用而不覆蓋Bar中的方法?

不。你可以勾選一些奇怪的仿制品Foo<T extends Foo>等 - 但它不會很令人滿意。

基本上需要為“this type”提供一些語言支持,其中該類型的唯一有效表達式為nullthis 那不存在,所以你留下了壓倒一切:

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

要么:

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

這只是繼承最終成為痛苦的案例之一:(

我確實嘗試過仿制葯......

public class Foo<T extends Foo> {

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

public class Bar extends Foo<Bar>{

    /* OTHER STUFF */
}

似乎工作。

我認為它的actullay返回Bar Only。 只需進行類型轉換即可將對象引用為Bar ,如下所示:

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

假設Foo存在getTitle()方法返回標題。

如果你在Bar類中添加另一個方法,例如getBarTitle

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

然后

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

說明:當您在new Bar()上調用setTitle時,該方法在Bar Object上調用, this表示Bar對象不是Foo ,因此它只返回Bar onject,類類型為Foo ,這是超類。 在這個過程中,它不會改變原始的類類型,它根本就是條形,因此類型轉換應該適合你的目的。

您可以使用具有上限的泛型:

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

public class Bar extends Foo<Bar> {
    ....
}

為了預防,它不返回Foo引用,它返回一個Bar引用,您可以使用System.out.println(reference.getClass()。getName())進行檢查。

當你寫作時,以同樣的方式,

List l=new ArrayList(); 

(忘記LIst是一個界面,它是旁邊的點)

l實際上是對ArrayList的引用,即使這個信息是“隱藏”的,但調用l.someMathod()調用ArrayList方法,而不是List方法 - 這就是Object Orientation的工作原理!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM