如何在C#中覆盖继承的类属性?

时间:2010-12-10 19:24:23

标签: c# class inheritance

我通过向基类中的方法添加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

3 个答案:

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