【问题标题】:Class Inheritance/Method Override类继承/方法覆盖
【发布时间】:2012-11-20 11:28:42
【问题描述】:

这是我第一次使用类,请原谅我的无知。

我有一个 Pet 类,它是我的基类。我有两个儿童班,狗和猫。我想要做的是让 Cat 和 Dog 方法通过说“Woof!”来覆盖 Pet 方法。和“喵!”而不是说话。然后以另一种形式,我必须在按下按钮时打印信息(姓名、颜色和他们说话)。

       class Pet
    {
        protected string name, color, food;

        public string Name
        {
            get
            {
                return name;
            }
            set
            {
                name = value;
            }
        }
        public string Color
        {
            get 
            {
                return color;
            }
            set
            {
                color = value;
            }
        }
        public string Food
        {
            get
            {
                return food;
            }
            set
            {
                food = value;
            }
        }
        public void speak(string s)
        {
            s = "Speak";
            MessageBox.Show(s);
        }

        public Pet(string name, string food, string color)
        {
            //Constructor
            this.Food = food;
            this.Name = name;
            this.Color = color;
        }




    class Dog : Pet
    {

        public Dog(string name, string food, string color)
            : base(name, food, color)
        {

        }

        protected override void speak()
        {

        }

    }

}

(省略了猫,因为它几乎和狗一样)

我不断收到错误“错误 1 ​​'Lab12.Cat.speak()': 在覆盖 'public' 继承成员 'Lab12.Pet.speak()' 时无法更改访问修饰符”

我做错了什么?我知道它与某处的保护级别有关,我不断将事情从公共切换到受保护或私有,但它没有解决任何问题。有人帮忙吗?

【问题讨论】:

    标签: c# class inheritance overriding


    【解决方案1】:

    基类中的 Speak 方法必须是虚拟的才能覆盖

    宠物类

      public virtual void speak(string s)
      {
          s = "Speak";
          MessageBox.Show(s);
      }
    

    而且你必须使用相同的修饰符(public)

    狗类

      public override void speak(string s)
      {
         base.speak(s);
      }
    

    【讨论】:

      【解决方案2】:

      嗯,你得到这个错误的原因是你从父类 Pet 继承了“speak”方法。您已将 speak() 方法声明为公共方法,然后您将继承它并使其受保护。我建议您在继承它并在 Dog、Cat、Monkey 类中覆盖它之后将其公开。

      【讨论】:

      • 被覆盖的基方法必须是虚拟的、抽象的或覆盖的,否则不能覆盖。
      【解决方案3】:

      由于 Speak() 最初是公开的,因此您需要保持公开。您“无法更改访问修饰符”(公共与私有)。

      此外,您不能覆盖非虚拟或静态方法。 被覆盖的基方法必须是虚拟的、抽象的或覆盖的。

      阅读:http://msdn.microsoft.com/en-us/library/ebca9ah3(v=vs.100).aspx

      【讨论】:

      • 所以 Dog 类需要有“public override void speak()”,而 Pet 类需要有“public virtual void speak(string s)”?这就是我现在所拥有的,它仍然给出同样的错误。字符串 s 有区别吗?
      • 签名必须匹配;因为Petpublic virtual void speak(string s),那么Dog 必须有public override void speak(string s)。请参阅 Joe 的链接。
      • 如果您使用的是 Visual Studio,Intellisense 将显示您在键入“覆盖”并按 Tab 时可以覆盖的方法。如果您要覆盖的方法不在列表中,很可能是因为它没有以可以被覆盖的方式声明。您只能覆盖抽象或虚拟方法(并且您可以覆盖覆盖......)
      【解决方案4】:
      protected override void speak()
          {
      
          }
      

      很确定这是因为您将子类中的 public 方法更改为 protected

      有错误告诉您在覆盖该方法时无法更改访问类型。所以,要解决这个问题,只需在 CatDog 中保持公开的方法即可:

      public override void speak()
          {
      
          }
      

      【讨论】:

        猜你喜欢
        • 2014-01-15
        • 2012-09-27
        • 1970-01-01
        • 2016-01-24
        • 1970-01-01
        • 2012-05-08
        • 1970-01-01
        • 2016-06-04
        • 2016-01-25
        相关资源
        最近更新 更多