為了方便演示,這裡一共有兩個簡單的類
父類:動物類(animal)
///
/// 動物類-父類
///
public
class
animal
///
/// 頭
///
public
string head
}
子類:狗類(dog)
///
/// 狗類-繼承動物類
///
public
class
dog:
animal
///
/// 建構函式
///
public
dog(
)}
第一步:如果我們將dog類轉換為animal類
dog dog =
newdog()
;//轉換為動物類---子類轉換為父類
animal animal = dog as animal;
這個按照我們一貫的想法,應該就是捨去子類的擴充套件屬性(這裡是tail),只保留父類中的屬性(foot,head)。那麼結果轉換後的animal類應該這樣的
第二步:而如果我們繼續把這個物件重新轉換為dog類dog dog2 = animal as dog;
dog類應該是這樣的
但是事實上,在第一步把dog
轉換為animal
時,animal
沒有把tail
這個欄位拋去,如下圖
但是,在vs的智慧型提示中我們並不能訪問tail
屬性,直接使用編譯也會報錯
而且從上面的結果中,我們也能猜出第二步的實際結果,dog
類中tail
並不是null
那麼父類怎麼轉換成子類呢?對於一些相對簡單的類,我們可以通過遍歷的方式逐個賦值
animal animal =
newanimal
;dog dog =
newdog
;
如果屬性多的時候,使用這種方法就麻煩了,這時可以使用反射
遍歷屬性來設定對應的值
animal animal =
newanimal
;dog dog =
newdog()
;//遍歷animal類的公共屬性
foreach
(propertyinfo item in
typeof
(animal)
.getproperties()
)
更多有關反射的內容可以參考官方文件到這裡結論應該清楚
C 中子類和父類之間的相互轉換
學c 的時候有時候會對類型別之間的轉換感覺到些許的迷惑,下面記錄一點點理解和認識 首先需要明白一點 只有子類轉換成父類,父類不可能轉換成子類。因為子類是從父類繼承而來,子類中包含父類中所有成員。而如果父類可以轉換成子類,意味著將子類中將有一部分是未知的成員。這是不被允許的。在子類轉換成父類的時候,也...
C 中子類與父類的相互轉換
1.父類不能直接強制轉換成子類 2.子類可以強制轉換成父類,但是在父類中只能取父類的字段與方法因此在乙個父類對應多個子類的時候,不知道具體是哪個子類的時候,就可以先宣告乙個父類的型別。如例1 3.由1,2知,父類不能直接強制轉換成子類,但是可以通過間接的方法進行轉換,例1中有所體現 將子類轉換成父類...
C 中子類和父類之間的相互轉化
c 父類和子類物件指標之間的轉換,有示例 c 父類和子類物件指標之間的轉換 由子類向父類轉換很簡單,用預設轉換.例如 cwnd pwnd cwnd childview 由父類向子類,用dynamic cast.使用dynamic cast是有限制的.例如對如下語句 cpoint3d p1 dynam...