3

这是我第一次上课,所以请原谅我的无知。

我有一个 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()' 时无法更改访问修饰符”

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

4

4 回答 4

4

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

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

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

于 2012-12-03T01:07:26.407 回答
1

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

宠物类

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

并且您必须使用相同的修饰符(公共)

狗类

  public override void speak(string s)
  {
     base.speak(s);
  }
于 2012-12-03T01:10:39.707 回答
0
protected override void speak()
    {

    }

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

有错误告诉您在覆盖该方法时无法更改访问类型。因此,要解决此问题,只需将方法在Catand中保持为公开Dog

public override void speak()
    {

    }
于 2012-12-03T01:07:15.073 回答
-1

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

于 2012-12-03T01:11:10.580 回答