类继承/方法覆盖

时间:2012-12-03 01:04:39

标签: c# class inheritance override

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

我有一个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 个答案:

答案 0 :(得分:4)

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

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

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

答案 1 :(得分:1)

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

宠物类

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

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

狗类

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

答案 2 :(得分:0)

protected override void speak()
    {

    }

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

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

public override void speak()
    {

    }

答案 3 :(得分:-1)

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