我有一个名为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
属性标记为虚拟。这是正确的做法吗?
答案 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 隐藏一个成员,它会抑制此警告。
如果你想覆盖属性,那么在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
}
}
}