2015-07-13 167 views
0
public class ABC 
    { 
    } 

    public class DEF : ABC 
    { 
    } 

    public class Class1 
    { 
     ABC abc = new DEF(); //No error 
     DEF def = new ABC(); //Compile time error 
    } 

任何人都可以向我解釋這種情況。 以及在什麼情況下我們可以使用它。C#繼承訪問混淆

回答

1

這稱爲多形現象。 如MSDN

說明在運行時,派生類的對象可以被視爲在地方 基類的對象,如方法參數和集合或 陣列。發生這種情況時,該對象的聲明類型不再是與其運行時類型相同的 。

基類可以定義和實現虛擬方法,並且派生類可以覆蓋它們,這意味着它們提供了它們自己的定義和實現。在運行時,當客戶端代碼調用 方法時,CLR將查找對象的運行時類型,並調用 來覆蓋虛擬方法。因此,在源代碼中,您可以調用基類上的方法,並使該方法的派生類版本 執行。

的這個問題是最好的解釋這裏MSDN Polymorphism

+0

該鏈接清除了所有內容。十分感謝 –

2

因爲根據OOD規則,您可以將子項分配給父項,但不能將父項分配給子項。

//this possible as you re assigning child to parent 
    ABC abc = new DEF(); //No error 
    //this is illegal as you are trying to assign child to parent directly 
    DEF def = new ABC(); //Compile time error 

再次重新考慮你的設計,或者如果你想父對象轉換爲孩子比你需要的方法爲直接轉換它不可能做到這一點按OOD規則。


考慮客戶與RetailCustomer或CorporateCustomer之間的實時關係。在哪裏可以輕鬆地說RetailCustomer或CorporateCustomer是客戶,但不能說Customer是RetailCustomer或CorporateCustomer,因爲客戶可以是任何類型。

Parent Shape Class和Child Rectangle,Circle等類之間的關係也是一樣的。

+0

感謝答案。我剛纔在這裏問過這個問題,因爲面試的人問我這個問題,我感到困惑......像一羣人一樣困惑的孩子! –

+0

@MayurMohite - 除了接受的答案,你也可以把一些真實世界的senario,因爲我已經給出了更新的答案... –

1

比方說ABCPerson,而DEFStudent(這是Person一個子類)。你總是可以治療Student作爲Person,所以分配給abc(的Person類型)的Student是正確的,但你不能把一個普通PersonStudent,所以分配給def是錯誤的(例如,你不能得到不是學生的人的學號)

+0

是啊...簡單的邏輯,謝謝! –