簡體   English   中英

通過引用具有繼承類類型的對象來創建基類類型變量

[英]creating a base class type variable with the reference to an object with the type of an inheriting class

class Program
{
    static void Main(string[] args)
    {
        BaseC instance = new DerivedC();
        // I don't see Y here.
        Console.ReadLine();
    }
}

public class BaseC
{
    public int x;
}
public class DerivedC : BaseC
{
    public int y;
}

我說的是Main函數的第一行。 當我這樣創建它時:DerivedC instance = new DerivedC(); 一切對我來說都很清楚,而且我看到了兩個變量,但是為什么以上述方式創建對象時卻看不到Y? 'instance'變量的類型(BaseC或DerivedC)如何影響結果?

這就是多態在C#中的工作方式:在基類類型的變量中,您可以存儲對任何子類實例的引用-但是,如果選擇這樣做,則只能通過以下方式“查看”基類成員:變量。 這樣做的原因是安全性:保證無論變量引用什么,它都會有一個x 但是,可能存在其他沒有y子類。

您可能會爭辯說,很明顯該變量引用了DerivedC ,但這僅僅是因為這是一個簡單的示例。 想象一下一些代碼,其中有一個將BaseC作為參數的函數。 可以在一個地方用DerivedC調用該函數,而在另一個地方用不帶yDifferentDerivedC調用。 然后,如果允許該函數訪問y ,則該函數將在第二次調用中失敗。

因為實例的類型是BaseC,所以它不會公開Property y。 要訪問Property y,您需要執行以下操作:

((DerivedC)instance).y

y是一個擴展屬性,只能從子類訪問。 那就是繼承的概念。 Child繼承child的屬性,而不是相反。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM