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属性。。。这对多态性不好我还认为问题在于如何重写属性,而不是如何隐藏它。不过,这仍然是一个不错的补充。