2010-12-10 140 views
14

我学会了如何通过将virtual添加到基类中的方法和override新类中来继承方法。但我该怎么做继承属性?如何覆盖C#中的继承类属性?

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不应该被用在这里。

回答

25

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!"; 
     } 
    } 
} 

注意,我必须标记为flyprotected

但即使是更好的,我会做这样的事情:

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; 
     } 
    } 
} 
+0

似乎工作,谢谢! :) – Rob 2010-12-10 19:30:47

+3

@Downvoter:真的,你应该解释。 – jason 2010-12-10 19:32:38

+0

我现在看到了downvote。我真的不想低估你的答案。虚假的鼠标点击?对不起,我把它删除了。 – Luca 2010-12-16 20:14:30

3

这是不是在你的榜样的属性,它是一个场。尝试使用属性,或者只是将fly标记为protected,以便可以在您的子类中进行访问。

1

此代码:

private virtual string fly = "Yes, I can!"; 

是创建一个领域,而不是财产。此外,为了虚拟,您的资产必须具有比“私人”更高的访问权限。你可能想要这样的事情:

public virtual string Fly 
{ 
    get { return "Yes, I can!"; } 
}