2012-09-18 27 views
4

我可以看到術語「upcast」與OOP有關,但我無法通過搜索Internet來找到確切的定義。什麼是「upcast」?

任何人都可以解釋這個術語是什麼意思,在什麼情況下這種技術有用?

+0

我不確定,但我認爲這是你回到父類的地方。舉個例子,閱讀關於多態性的文章。 – slugonamission

+0

我不能說我真的知道這個定義離我頭頂有多遠,但我猜想@slugonamission是正確的。 – Wug

回答

5

從標籤的您發佈的描述:

上溯造型允許一個子類類型的對象被視爲任何超類型的對象。

基本上,它就是你投一個子類的實例,以它的一個父,以顯示僞代碼的例子

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等與他們不同的模型和動畫,填補空白的方法是有意義的。這些「空白」方法也可以被稱爲抽象或純粹的方法。

+0

有一個問題,既然你已經將D鑄造到Base中,你如何訪問Dog的'say_hi()'?我覺得很難理解。你能給我一個具體的例子,而不是僞代碼嗎? –

+1

我同意你slugonamission,但你應該在僞代碼中添加一條提示,指示狗和人擴展基地。 – Dan

+0

@丹 - 哎呀,謝謝。這就是你在早上編寫代碼的過程。 – slugonamission

1

上傳基本上是一種對象創建機制,我們通過引用它們的基類來創建對象。我們通過在對象定義中用基類替換子類來實現這一點。當您知道創建的專用對象不一定會使用它提供的所有功能時,這一點特別方便。所以,用基類替換一個子類(繼承類),你所做的就是上傳。

如果我們舉一個例子,可以很好地理解這個概念。假設我們有三個類。一個父類或泛化類稱爲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對象。

相關問題