我有一個關于在 c# 中覆寫屬性的問題。這里已經有一個類似的問題,但答案對我來說并不令人滿意。假設我有傳入的課程:
class A
{
public int Prop { get; }
}
class B : A
{
public int Prop { get; set; }
}
現在如您所見,我想在子類中的屬性 Prop 中添加一個 setter。我想出了兩個解決方案。第一個是使 peoperty 虛擬并在 B 類中覆寫它,如下所示:
class A
{
public virtual int Prop { get; }
}
class B : A
{
public override int Prop { get; set; }
}
但不幸的是,編譯器不允許我這樣做。我的第二個想法是使用“新”關鍵詞:
class A
{
public virtual int Prop { get; }
}
class B : A
{
public new int Prop { get; set; }
}
現在一切似乎都有效,但由于一個細節,這對我來說并不是一個令人滿意的解決方案。例如,讓我們考慮這段代碼:
B b = new B();
b.Prop = 5;
A a = b;
Console.WriteLine(a.Prop);
您可能知道我在輸出中得到 0,但我想得到 5。有沒有辦法解決這個問題?
uj5u.com熱心網友回復:
A 不是 B 的子類,這不是繼承的作業方式。我不明白你為什么要這樣做,我認為你誤解了繼承的完整概念
如果您建議:
class A
{
public int Prop { get; }
}
class B : A
{
public int Prop { get; set; }
}
它們是相同的屬性。如果您執行以下操作:
class A
{
public int Prop { get; }
}
class B : A
{
public int AnotherProp { get; set; }
}
你可以設定:
B instance = new B();
B.Prop = 5;
如果您想要做的是在子類中擁有一個具有相同名稱的屬性(不推薦),您可以這樣做,而無需使用繼承:
internal class A
{
internal int Prop { get; }
}
internal class B
{
internal A MySubClass { get; set; }
}
B instanceB = new B();
A instanceA = new A();
instanceA.Prop = 5;
B.MySubClass = instanceA;
或者你可以玩它,而不直接復制它。class as property只是一個例子,向您展示和之間的區別inheritance
uj5u.com熱心網友回復:
財產的set期限class A應受到保護。您仍然可以覆寫它,并且它仍然無法在外部class A及其子項中訪問。
uj5u.com熱心網友回復:
您可以嘗試顯式實作屬性的設定器。這需要一個介面:
public interface IPropSet
{
int Prop { set; }
}
class A
{
public int Prop { get; }
}
class B : A, IPropSet
{
int IPropSet.Prop { set { } }
}
但不幸的是,如果不強制轉換為,則無法設定此屬性IPropSet:
((IPropSet)new B()).Prop = 1;
uj5u.com熱心網友回復:
在Console.WriteLine(a.Prop); 您參考 A.Prop,B 類中的新 Prop 用于重新定義。
當用作宣告修飾符時,new 關鍵字顯式隱藏從基類繼承的成員。當您隱藏繼承的成員時,該成員的派生版本將替換基類版本。這假定成員的基類版本是可見的,因為如果它被標記為私有或在某些情況下是內部的,它將已經被隱藏。盡管您可以在不使用 new 修飾符的情況下隱藏公共或受保護成員,但您會收到編譯器警告。如果您使用 new 顯式隱藏成員,它會抑制此警告。
但你可以使用,
if (a is B bb) { Console.WriteLine(bb.Prop); }或者使用這個模式
class A { public virtual int Prop { get; protected set; } } class B : A { public void SetProp(int prop) => Prop = prop; } B b = new B(); b.SetProp(5); A a = b; Console.WriteLine(a.Prop);轉載請註明出處,本文鏈接:https://www.uj5u.com/net/474948.html

