iT邦幫忙

0

詢問C# Interface與實質型別轉型問題

想要請教有一實質型別繼承一介面如下:
https://ithelp.ithome.com.tw/upload/images/20191124/20123104wNFsoai29D.png
當我var一個object1變數去接轉型成interface的實質型別,為什麼最後的type依然是實質型別的型態呢? (執行結果下)
https://ithelp.ithome.com.tw/upload/images/20191124/20123104IwW5SnU71I.png

double a = 1.1;
int b = (int)a;
基本型態的轉型會改變記憶體中儲存的內容
這種類型的變數會儲存在 stack 內
a 和 b 有各自的空間

而參考比較像一個指標
var a = new Pigeons();
指標 a 指向一個記憶體空間 Pigeons
a 儲存在 stack 內,Pigeons 存儲在 heap 內
對參考類型轉型並不會像基本型態一樣影響記憶體中存放的東西 (heap內的東西)
例如 var b = (Bird)a; 或 (Bird)new Pigeons();
參考的轉型只是為了強型別和多型

石頭大的文章講得很詳細

2 個回答

0
阿展展展
iT邦好手 1 級 ‧ 2019-11-24 22:27:00

介面 (C# 程式設計手冊)

「介面」(interface)包含非抽象類或結構必須執行之相關功能群組的定義。
例如,您可以藉由使用介面,在類別中包含多個來源的行為。 這項功能在 C# 中是很重要的,因為語言不支援類別的多重繼承。 此外,如果您要模擬結構繼承,則必須使用介面

因為它們實際上無法繼承自另一個結構或類別。

介面 (C# 程式設計手冊)

7
石頭
iT邦研究生 2 級 ‧ 2019-11-24 23:01:56

在解釋這個問題前首先要先理解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

原來 struct 屬性會被 clone,發現新大陸 ~

我要發表回答

立即登入回答