簡體   English   中英

在基類的實例上設置派生類的屬性

[英]Set property of derived class on base class' instance

我有一個這樣的基類:

class Document {
    int number {get; set;}
    double sum {get; set;}
}

...和兩個派生類:

class Bill : Document {
    double advance {get; set;}
}

class Quote : Document {
    double discount {get; set;}
}

在編譯時,我知道將要處理Document類型的對象。 但是,只有在運行時,我才能知道它是Bill還是Quote

我需要根據類型執行特定的操作,例如:

if (myDoc.GetType() == typeof(Bill)) {
   myDoc.advance = 1000; //<-- can't find "advance"
}

..但我不能那樣編譯,因為無法從基實例訪問派生類的屬性。

這樣做的正確方法是什么? 這是一個玩弄小提琴

myDoc.advance只能編譯如果編譯器在編譯時告訴myDocBill 否則, myDoc只是一個Document並且該類型沒有advance成員。

進行類似的類型檢查不會修改myDoc的靜態類型。 相反,您必須先將其類型轉換為Bill

Bill myBill = (Bill)myDoc;
myBill.advance = 1000;

請注意,您應該使用is運算符來驗證myDocBill ,而不是使用檢查確切的運行時類型的GetType() 您甚至可以使用C#中較新的模式匹配語法來使此更好:

if (myDoc is Bill myBill) {
    myBill.advance = 1000;
}

最后,請注意,通用約定是在PascalCase中用C#編寫屬性(即AdvanceNumberSumDiscount )。

另請注意,默認情況下,類成員是私有的,因此您仍然無法訪問這些屬性。 因此,您必須在屬性定義前面添加一個public

如果您使用的是C#7.0+,則模式匹配是解決此問題的好方法

if(myDoc is Bill bill)
{
    bill.Advance = 1000;
}
else if(myDoc is Quote quote)
{
    quote.Discount = 1000;
}

您可以簡單地將其轉換為:

if (myDoc.GetType() == typeof(Bill))
{
    ((Bill)myDoc).advance = 1000;
}

暫無
暫無

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

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