回覆列表
  • 1 # 使用者6132430448654

    首先要說明一點,題主的這個問題不只是C#,而是所有面向物件的語言都有的一個特性。

    其次明確一點,題主提到的資料轉換本質是引用的轉換,即子類的引用可以直接轉換為父類的引用。而不是把子類的記憶體空間硬擠進父類的空間中。

    澄清了上述兩點之後,以下是對題主問題的解答:

    對父類的引用,其本質是對父類的方法和屬性的引用,而子類必然繼承了這些方法和屬性。所以子類的引用直接轉換成父類的引用不會有任何問題,因為父類引用的所有方法子類都繼承或實現了。

    具體來說如下兩個類,B類是A的子類。

    那麼如下的引用是否可以轉呢?

    換個角度來說,父類可以看做是一種協議或約定,子類繼承的是什麼?繼承的就是這個協議和約定。也就是大家遵從同一種協議或約定,因此子類可以被當做父類使用而不會產生任何問題。

    以上解釋了為什麼可以轉換,題主另一個問題是資料有沒有丟失?答案是沒有丟失,因為子類的記憶體空間並沒有改變,只是引用改變了。其實題主可能想問的是:轉換之後,子類的方法有沒有丟失。當然“丟失”了,因為父類的引用並不知道子類有沒有新增別的方法。

    從上面的程式碼可以看出,子類的f2這個方法在父類的引用中“丟失”了。但其實所有資料都沒有丟失,只是父類的引用不知道子類有這個方法而已。

    做個更直觀的比喻,智慧手機是功能手機的子類,智慧手機繼承了功能機的所有功能(打電話,發簡訊),智慧機有更多的功能(安裝了其他的APP)。

    那麼題主的問題就相當於是:為什麼智慧機可以直接被當做功能機使用呢?

    答案是當然可以了,把智慧機當做功能機使用不會有任何問題。

    智慧機的資料丟失了嗎?當然沒有,智慧機還是智慧機。只不過只會使用功能機的人只知道打電話和發簡訊,並不知道智慧機都安裝了什麼別的APP。

  • 中秋節和大豐收的關聯?
  • 我失戀了,特別傷心,想送給自己一首失戀詩?