[英]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
只能編譯如果編譯器在編譯時告訴myDoc
是Bill
。 否則, myDoc
只是一個Document
並且該類型沒有advance
成員。
進行類似的類型檢查不會修改myDoc
的靜態類型。 相反,您必須先將其類型轉換為Bill
:
Bill myBill = (Bill)myDoc;
myBill.advance = 1000;
請注意,您應該使用is
運算符來驗證myDoc
是Bill
,而不是使用檢查確切的運行時類型的GetType()
。 您甚至可以使用C#中較新的模式匹配語法來使此更好:
if (myDoc is Bill myBill) {
myBill.advance = 1000;
}
最后,請注意,通用約定是在PascalCase中用C#編寫屬性(即Advance
, Number
, Sum
和Discount
)。
另請注意,默認情況下,類成員是私有的,因此您仍然無法訪問這些屬性。 因此,您必須在屬性定義前面添加一個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.