2011-10-18 40 views
4

在多態性我瞭解到,只有派生類可以是基類,但看看我的例子,一個基類,現在是一個派生類:在Polymorphism中,只有派生類可以是基類,這裏會發生什麼?

static void Main() 
{ 
    Person a = new Customer(); 

    //here a base class is a derived class 
    Customer c = (Customer)a; 
} 

class Person 
{ 
} 

class Customer : Person 
{ 
} 

爲什麼這是可能的嗎?

派生類的成員上的基類實例化時,不應被丟棄?

如果我在基類中實例化派生類,分配的內存大小是派生類的大小?

+2

只需對自己說:「客戶*是A *個人」,它應該都變得清晰:如果客戶是個人,則可以將其分配給Person對象。如果你知道這個特定的人是一個客戶,你可以將其重新投入。 – Krumelur

回答

4

由於實際上是客戶對象,這將很好地工作。讓我更具體地說:
a是Person類型的「變量」,它可以容納任何類型的「對象」,從Person到其任何子類。
c是Client類型的「變量」,可以將任何類型的「對象」保存到其任何子類中。

你所做的是把一個客戶的「對象」到人的「變量」。無論你移動這個對象,它總是一個Client對象。因此,我們需要牢記的是,即使您將Client的「對象」放入Person類型的「變量」中,對象類型仍然是客戶端。在下一個語句中,您只是將對象移動到了正確的類型。

變量是一樣的籃子。它可以容納比它小的任何東西。如果將物體從籃筐中取出並放入另一個籃筐中,則該物體仍然保持不變。

+0

在基類上實例化時,不應該拋棄派生類的成員?如果我在基類中實例化派生類,分配的內存大小是派生類的大小? –

+2

這就是多態的完整點:寶馬和大衆都是汽車。汽車A =新寶馬(),汽車B =新大衆(); - 任何能處理汽車的東西都可以處理寶馬,大衆或法拉利。它不需要關心。在.NET中,大衆或寶馬的特色(變量)都在汽車中,但只有在將汽車投入寶馬/大衆汽車時才能訪問它們。他們不會丟失。 – Krumelur

+1

您沒有在基類中實例化派生類。您實例化派生類並將此對象的地址放入基類變量中。內存大小等根本不受影響。 –

0

雖然上述不工作(在其他的答案提到的),下面會失敗,這也許是不是要投基類派生類(除非你真的知道在運行時的類型)的點。

static void Main() 
{ 
    Person a = new Customer(); 

    //This will fail at runtime. 
    Programmer c = (Programmer)a; 
} 

class Person 
{ 
} 

class Customer : Person 
{ 
} 

class Programmer: Person 
{ 
} 
相關問題