如何覆盖抽象类的属性?

时间:2015-03-11 09:51:37

标签: c# properties abstract

我有一个名为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属性标记为虚拟。这是正确的做法吗?

4 个答案:

答案 0 :(得分:4)

要覆盖属性,它必须在基类中是虚拟的,并在派生类中具有覆盖:

class CharacterBase {
    public virtual int Level {get;set;}
}

class Character : CharacterBase {
    public override int Level { /* */ }    
}

答案 1 :(得分:2)

  

是否可以覆盖此属性并创建自己的属性   而不是抽象类的一个?

您可以使用new modifier拥有自己的属性而不是继承属性,尽管您可以通过添加new修饰符隐藏基类成员。注意隐藏基类属性会消除你的多态行为。

public new int Level
{
    get
    {
        return level;
    }
    set
    {
        level = value;
        Console.WriteLine("The new level is " + level + ".");
    }
}

new Modifier

  

当用作声明修饰符时,新关键字显式隐藏   从基类继承的成员。当你隐藏一个   继承成员,成员的派生版本替换基础   班级版。虽然您可以隐藏成员而不使用新成员   修饰符,你得到一个编译器警告。如果你明确地使用new   隐藏一个成员,它会抑制此警告。

如果你想覆盖属性,那么在post中使用覆盖,使基类属性变为虚拟。

class CharacterBase 
{
    public virtual int Level {get;set;}
}

class Character : CharacterBase 
{
    public override int Level { get; set; }    //You can give get set implementation here 
}

答案 2 :(得分:2)

如果您希望该属性始终由子类实现,您也可以将其设为抽象:

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。

答案 3 :(得分:0)

为了能够覆盖它,它必须是虚拟的:

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
        }
    }
}