[英]How can I override an abstract class' property?
我有一個名為CharacterBase
的抽象類。 在里面,我有一些屬性。 例如:
public int Level { get; set; }
我有一個名為Character
的類,該類繼承自CharacterBase
。 我希望能夠以某種方式覆蓋Level
屬性並創建自己的屬性。 例如:
int level;
public (override?) int Level
{
get
{
return level;
}
set
{
level = value;
Console.WriteLine("The new level is " + level + ".");
}
}
是否可以覆蓋此屬性,並使其成為我自己的屬性而不是抽象類的屬性?
編輯:我將Level
屬性標記為虛擬。 這是正確的方法嗎?
要覆蓋屬性,它必須在基類中是虛擬的,並在派生類中具有重寫:
class CharacterBase {
public virtual int Level {get;set;}
}
class Character : CharacterBase {
public override int Level { /* */ }
}
是否可以覆蓋此屬性,並使其成為我自己的屬性而不是抽象類的屬性?
您可以使用new modifier
來擁有自己的屬性,而不是繼承屬性,盡管您可以通過添加new修飾符來隱藏基類成員。 請注意,隱藏基類屬性將使您擺脫多態行為。
public new int Level
{
get
{
return level;
}
set
{
level = value;
Console.WriteLine("The new level is " + level + ".");
}
}
當用作聲明修飾符時,new關鍵字顯式隱藏從基類繼承的成員。 隱藏繼承的成員時,成員的派生版本將替換基類版本。 盡管可以在不使用new修飾符的情況下隱藏成員,但是會收到編譯器警告。 如果使用new顯式隱藏成員,它將禁止顯示此警告。
如果要覆蓋該屬性,則可以通過將基類屬性設置為虛擬來像在發布中一樣使用覆蓋。
class CharacterBase
{
public virtual int Level {get;set;}
}
class Character : CharacterBase
{
public override int Level { get; set; } //You can give get set implementation here
}
如果希望該屬性始終由子類實現,則也可以使其抽象:
public abstract class CharacterBase
{
public abstract int Level { get; set; }
}
public class Character : CharacterBase
{
private int level = 1;
public override int Level
{
get { return level; }
set
{
level = value;
Console.WriteLine("The new level is {0}.", level);
}
}
}
如果您希望能夠覆蓋它,但又不強制其被覆蓋,則只需在父類屬性簽名中將abstract更改為virtual即可。
為了能夠覆蓋它,它必須是虛擬的:
public abstract class CharacterBase
{
public virtual int Level { get; set; }
}
public class ConcreteCharacter : CharacterBase
{
public override int Level
{
get
{
return 1; //or whatever
}
set
{
// your implementation
}
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.