类继承/方法覆盖

3

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

我有一个宠物类作为我的基类。我有两个子类,狗和猫。我想做的是让猫和狗的方法覆盖宠物方法,并用“汪!汪!”和“喵!喵!”代替说话。然后在另一个表单中,当按下按钮时,需要打印信息(名称、颜色和他们说话的内容)。

       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()' 的访问修饰符”。

我做错了什么?我知道这与保护级别有关,在 public、protected 或 private 之间切换,但仍然无法解决问题。请帮帮我,有人可以帮忙吗?

4个回答

4

由于 Speak() 最初是公共的,因此您需要保持其公共状态。您“无法更改访问修饰符”(public vs private)。

此外,您无法覆盖非虚拟或静态方法。重写的基本方法必须是虚拟、抽象或重写的。

请阅读: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有影响吗? - user1831281
签名必须匹配;因为 Petpublic virtual void speak(string s),那么 Dog 必须有 public override void speak(string s)。请参见乔的链接。 - Edmund Schweppe
如果您正在使用Visual Studio,Intellisense会在您键入“override”并按下Tab时显示您可以重写的方法。如果您要重写的方法不在列表中,则很可能是因为它没有以可重写的方式声明。您只能重写抽象或虚拟方法(并且您可以重写覆盖...)。 - Joe

1

为了覆盖,您的基类中的Speak方法必须是虚拟的

宠物类

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

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

狗类

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

0
protected override void speak()
    {

    }

我相信问题是由于你在子类中将一个public方法更改为protected
错误提示说明,当覆盖方法时,不能更改访问类型。因此,要解决这个问题,只需在CatDog中保持方法的公共访问权限即可。
public override void speak()
    {

    }

-1

嗯,你出现这个错误的原因是你从父类Pet继承了"speak"方法。你已经将speak()方法声明为公共方法,然后你又将其继承并变成了受保护的。我建议你在继承时将其保持为公共方法,并在Dog、Cat、Monkey类中进行重写。


重写的基类方法必须是虚拟、抽象或重写的,否则无法进行重写。 - Joe

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接