[英]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”提供一些語言支持,其中該類型的唯一有效表達式為null
和this
。 那不存在,所以你留下了壓倒一切:
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.