回答
從標籤的您發佈的描述:
上溯造型允許一個子類類型的對象被視爲任何超類型的對象。
基本上,它就是你投一個子類的實例,以它的一個父,以顯示僞代碼的例子
class Base {
function say_hi() { printf("Hello From Base Class\n"); }
}
class Person extends Base {
function say_hi() { printf("Hello!"); } // Overridden. Java expects an @Override annotation
}
class Dog extends Base {
function say_hi() { printf("Woof!"); } // Again, overridden
}
Base B = new Base();
Base P = new Person(); // Implicit upcast
Dog dog = new Dog();
Base D = (Base)Dog(); // Explicit upcast
B.say_hi(); // Hello from base class
P.say_hi(); // Hello!
D.say_hi(); // Woof!
有各種各樣的時候,這是非常有用的。一般來說,它定義了一個排序的接口,所以你可以繼承一些東西,但仍然在其原始上下文中使用它。假設你有一個遊戲,你會有一個敵對物體。這有一些共同的功能,如它的當前位置,速度,健康狀況和其他東西。儘管如此,一些敵人可能會有不同的動作,可能會播放不同的死亡動畫,當然,它們的繪製方式會有所不同。問題在於,由於它們具有相同的界面,因此不需要特殊的代碼來處理每種不同類型的敵人。
用這些字段和空方法制作一個基礎的「敵人」類,然後將它擴展爲具有SmallEnemy,EvilEnemy,BossEnemy等與他們不同的模型和動畫,填補空白的方法是有意義的。這些「空白」方法也可以被稱爲抽象或純粹的方法。
有一個問題,既然你已經將D鑄造到Base中,你如何訪問Dog的'say_hi()'?我覺得很難理解。你能給我一個具體的例子,而不是僞代碼嗎? –
我同意你slugonamission,但你應該在僞代碼中添加一條提示,指示狗和人擴展基地。 – Dan
@丹 - 哎呀,謝謝。這就是你在早上編寫代碼的過程。 – slugonamission
上傳基本上是一種對象創建機制,我們通過引用它們的基類來創建對象。我們通過在對象定義中用基類替換子類來實現這一點。當您知道創建的專用對象不一定會使用它提供的所有功能時,這一點特別方便。所以,用基類替換一個子類(繼承類),你所做的就是上傳。
如果我們舉一個例子,可以很好地理解這個概念。假設我們有三個類。一個父類或泛化類稱爲LIVING_THINGS類和從前者繼承的兩個子類ANIMAL和BIRD。父類或基類具有函數,例如Born()和Die()。專門的類具有函數,分別爲ANIMAL和BIRD分別表示Run()和Fly()。
要創建一個動物和鳥類的對象,你通常會使用下面的語法:
ANIMAL animal = new ANIMAL();
BIRD bird = new BIRD();
在上面的代碼,該方法的run()和飛()與創建的對象正常工作。這是您創建對象的正常方式。用於創建對象的引用與運行時創建的對象類型完全相同。子類的方法工作得很好。
但是,創建一個上溯造型,你可以使用下面的語法:
LIVING_THINGS animal = new ANIMAL();
在上面的代碼,儘管我們已經創建的類型動物和鳥類的對象,使用的參考實際上是基地級。因此,Run()和Fly()方法不適用於這些對象。相反,只有基類中可用的函數(例如Born()和Die())可用。 如果您只想在開始時提供基本功能,並希望稍後將其原始類型的這些對象轉換爲使其專用功能可用,則此功能非常有用。這可以在Downcasting的幫助下完成。向下轉換可以將這些對象的引用類型更改爲專用的子類,以使可用的功能不可用。觀看下面的代碼:
ANIMAL new_animal = animal as ANIMAL;
在上面的代碼中,我們已經創建了新對象,並將其轉換爲一個動物類型。實際檢查要轉換的對象是否支持轉換應該是一個好習慣。這可以用的幫助下做的是關鍵字
if (animal is ANIMAL)
{
ANIMAL new_animal = animal as ANIMAL;
new_animal.Run();
}
隨着向下轉換的幫助下,我們已經恢復了所有功能和該動物對象應該具有的特性。現在它表現爲一個適當的ANIMAL對象。
- 1. 爲什麼Upcast不起作用?
- 2. 爲什麼dynamic_cast可以用於非多態類型的upcast?
- 3. 爲什麼使用算術和訪問操作符時的upcast
- 4. 「方法未定義類型」錯誤,適用於upcast - 發生了什麼?
- 5. Ckeditor觸發控件的對話框upcast
- 6. 什麼「?」做?什麼是__FILE__?
- 7. 什麼是<NS0:什麼?
- 8. 什麼是setDetailItem:做什麼?
- 9. 什麼是純SVG和什麼是SMIL?
- 10. 春天 - 什麼是豆,什麼不是?
- 11. 什麼是PPC,這是什麼意思?
- 12. 是什麼代碼是什麼意思?
- 13. 什麼是session_reset()到底是什麼?
- 14. 是什麼!<是什麼意思?
- 15. 是什麼意思:是什麼意思?
- 16. 這是什麼`_time_independent_equals`是什麼意思?
- 17. 什麼是.size是什麼意思
- 18. 什麼是()=> {}是什麼意思?
- 19. 什麼是Ext.apply xtype是什麼意思?
- 20. 什麼是$ http timeout是什麼意思?
- 21. 是什麼??('')。?。?`是什麼意思?
- 22. dir是什麼? dir +「/」:「」是什麼意思?
- 23. 什麼是AjaxAdapter和什麼是query()?
- 24. 什麼是stringWithFormat:@「%@ - 1」是什麼意思?
- 25. Django:什麼是`sys.path`應該是什麼?
- 26. 什麼是MIME?它到底是什麼?
- 27. 什麼是PHPCI - 什麼是構建?
- 28. 什麼是流量?什麼是`initialize`在做什麼?
- 29. 什麼是JSTL?什麼是JSP標籤庫?有什麼區別?
- 30. 究竟是什麼ObjectFactory是什麼,它用於什麼?
我不確定,但我認爲這是你回到父類的地方。舉個例子,閱讀關於多態性的文章。 – slugonamission
我不能說我真的知道這個定義離我頭頂有多遠,但我猜想@slugonamission是正確的。 – Wug