想要請教有一實質型別繼承一介面如下:
當我var一個object1變數去接轉型成interface的實質型別,為什麼最後的type依然是實質型別的型態呢? (執行結果下)
介面 (C# 程式設計手冊)
「介面」(interface)包含非抽象類或結構必須執行之相關功能群組的定義。
例如,您可以藉由使用介面,在類別中包含多個來源的行為。 這項功能在 C# 中是很重要的,因為語言不支援類別的多重繼承。 此外,如果您要模擬結構繼承,則必須使用介面
因為它們實際上無法繼承自另一個結構或類別。
在解釋這個問題前首先要先理解Reference type
在記憶體中怎麼運作的
簡單來說Reference type
需要動態產生記憶體且放在Heap
上.
var obj1 = (Bird)new Pigeons();
上面這段程式碼會動態配置一個記憶體區段給obj1
且這個物件是Pigeons
型別
所以你最後用obj1.GetType()
類型就是Pigeons
當我var一個object1變數去接轉型成interface的實質型別,為什麼最後的type依然是實質型別的型態呢?
在OOP
有另一個很重要的概念
父類別可以指向子類別(這是OOP實現的關鍵,有這個才有辦法執行多態)
上面那段程式碼你只是把obj1
當作Bird
介面型別指向Pigeons
物件記憶體位置(但實際這個位置上還是Pigeons
型別物件)
你的程式碼可以等同於下面這樣
Bird obj1 = new Pigeons();
可以參考我之前寫的文章 https://dotblogs.com.tw/daniel/2018/02/22/135011