类继承/方法重写(Class Inheritance/Method Override)

2019-07-04 09:54发布

这是我第一次带班工作,所以请原谅我的无知。

我有一个宠物类,它是我的基类。 我有两个孩子类,狗和猫。 我正在试图做的是有猫与狗的方法说覆盖宠物法“汪!” 和“喵!” 而不是说话。 然后以另一种形式我要打印的信息(名称,颜色,和他们谈话的内容)上的按钮按下。

       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()’:无法更改访问修饰符覆盖,当‘公’继承成员‘Lab12.Pet.speak()’”

我究竟做错了什么? 我知道它有什么地方与保护级别做的,我一直从公众对保护或私人交换的东西,但它没有固定任何东西。 帮助,任何人?

Answer 1:

由于说话()原本是公开的,你需要保持公众。 你“不能改变访问修饰符”(公共VS私人)。

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

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



Answer 2:

将发话方法必须在你的基类重写虚拟

宠物类

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

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

狗类

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


Answer 3:

protected override void speak()
    {

    }

很肯定那是因为你正在改变一个public的方法来protected的子类。

有错误是告诉你重写方法时,你不能改变的访问类型。 因此,要解决这个问题只保留一种方法,在公CatDog

public override void speak()
    {

    }


Answer 4:

那么,为什么你得到这个错误的原因是,你继承了父类宠物的“说话”方式。 您已声明说话()方法作为公共方法,然后你继承它,使受保护的。 我建议你把它公开,一旦你继承并覆盖在类狗,猫,猴。



文章来源: Class Inheritance/Method Override