【问题标题】:How to override an inherited class property in C#?如何在 C# 中覆盖继承的类属性?
【发布时间】:2011-05-23 16:29:48
【问题描述】:

我通过将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

【问题讨论】:

    标签: c# class inheritance


    【解决方案1】:

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

    【讨论】:

    • 我现在看到了反对票。我真的不想拒绝你的回答。假鼠标点击?很抱歉给您带来不便,我已将其删除。
    • @Luca:这不是不便,我只是想知道我的回答是否有问题。感谢您回来发表评论!
    【解决方案2】:

    在您的示例中,这不是一个属性,而是一个字段。尝试使用属性,或者简单地将 fly 标记为受保护,以便可以在您的子类中访问它。

    【讨论】:

      【解决方案3】:

      这段代码:

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

      正在创建一个字段,而不是一个属性。此外,为了成为虚拟的,您的财产必须具有高于“私人”的访问权限。你可能想要这样的东西:

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

      【讨论】:

        猜你喜欢
        • 2013-12-04
        • 2012-07-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多