我通过向基类中的方法添加virtual
和在新类中添加override
来学习如何继承方法。但是我该如何继承属性呢?
class bird
{
private virtual string fly = "Yes, I can!";
public string CanI() { return fly ; }
}
class penguin : bird
{
private override string fly = "No, I can't!";
}
这会弹出一个错误,说明不应在此处使用修饰符virtual
/ override
。
答案 0 :(得分:29)
fly
不是属性,而是字段。字段不可重写。你可以这样做:
class bird {
protected virtual string Fly {
get {
return "Yes, I can!";
}
}
public string CanI() { return Fly; }
}
class penguin : bird {
protected override string Fly {
get {
return "No, I can't!";
}
}
}
请注意,我必须将fly
标记为protected
。
但更好的是,我会做这样的事情:
abstract class Bird {
public abstract bool CanFly { get; }
public string SayCanFly() {
if(CanFly) {
return "Yes, I can!";
}
else {
return "No, I can't!";
}
}
}
class Penguin : Bird {
public override bool CanFly {
get {
return false;
}
}
}
class Eagle : Bird {
public override bool CanFly {
get {
return true;
}
}
}
答案 1 :(得分:3)
这不是您示例中的属性,而是一个字段。尝试使用属性,或者只是将fly标记为受保护,以便可以在子类中访问它。
答案 2 :(得分:1)
此代码:
private virtual string fly = "Yes, I can!";
正在创建一个字段,而不是属性。此外,为了虚拟,您的财产必须具有高于“私人”的访问权限。你可能想要这样的东西:
public virtual string Fly
{
get { return "Yes, I can!"; }
}