C# 如何重写抽象类';财产?

C# 如何重写抽象类';财产?,c#,properties,abstract,C#,Properties,Abstract,我有一个名为CharacterBase的抽象类。在它里面,我有一些属性。例如: public int Level { get; set; } int level; public (override?) int Level { get { return level; } set { level = value; Console.WriteLine("The new level is " + level +

我有一个名为
CharacterBase
的抽象类。在它里面,我有一些属性。例如:

public int Level { get; set; }
int level;

public (override?) int Level
{
    get
    {
        return level;
    }
    set
    {
        level = value;
        Console.WriteLine("The new level is " + level + ".");
    }
}
我有一个名为
Character
的类,它继承自
CharacterBase
。我希望能够以某种方式覆盖
级别
属性,并创建自己的属性。例如:

public int Level { get; set; }
int level;

public (override?) int Level
{
    get
    {
        return level;
    }
    set
    {
        level = value;
        Console.WriteLine("The new level is " + level + ".");
    }
}
是否有可能重写此属性并使其成为我自己的属性,而不是抽象类的属性


编辑:我将
级别
属性标记为虚拟。这是正确的方法吗?

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

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

class Character : CharacterBase {
    public override int Level { /* */ }    
}
是否可以覆盖此属性并创建一个属于我自己的属性 而不是抽象类的

虽然可以通过添加新的修饰符隐藏基类成员,但可以使用来拥有自己的属性,而不是继承的属性。注意:隐藏基类属性将使多态行为从您身上消失

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

当用作声明修饰符时,new关键字显式隐藏 从基类继承的成员。当你隐藏一个 继承的成员,则该成员的派生版本将替换基成员 类版本。尽管您可以隐藏成员而不使用新的 修饰符,您将收到编译器警告。如果使用new显式 如果隐藏成员,则会抑制此警告

如果要重写该属性,请通过使基类属性为虚拟属性,像在post中一样使用in override

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 virtual int Level { get; set; }
}

public class ConcreteCharacter : CharacterBase
{
    public override int Level
    {
        get
        {
            return 1; //or whatever
        }
        set
        {
            // your implementation
        }
    }
}

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

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

如果您希望能够覆盖它,但不希望强制覆盖它,您只需在父类属性签名中将抽象更改为虚拟。

您可以使用
new
而不是
override
,或者您可以选择将其标记为抽象,以强制所有继承类实现该属性。正如我在回答中所述:在基类中抽象属性将强制该属性的子类类来实现它。让它成为虚拟的,你让孩子们选择是否实现它。在这两种情况下,子类都需要override关键字。重写或使用新运算符有什么区别?@GilbertWilliams检查Adils下的注释answer@GilbertWilliams如果您希望能够使用重写属性,即使您使用CharacterBase类型的引用访问它。。。CharacterBase character=新的ConcreteCharacter()。。。然后它要么是抽象的(然后从Characterbase派生的所有类都必须实现该属性),要么是虚拟的(只有您希望显式更改该属性的类必须重写该属性)@GilbertWilliams因此,您是否需要此多态性是个问题。通常,为了避免设计错误,您会坚持使用“抽象”或“虚拟”。不过,您应该提到,如果将对象强制转换为CharacterBase,则将使用base属性。。。这对多态性不好我还认为问题在于如何重写属性,而不是如何隐藏它。不过,这仍然是一个不错的补充。