簡體   English   中英

如何覆蓋抽象類的屬性?

[英]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.

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