2012-12-03 55 views
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()’:'压倒一切的时候不能改变访问修饰符公共'遗传成员'Lab12.Pet.speak()'“

我在做什么错?我知道它与某个地方的保护级别有关,并且我始终将事情从公开转换为受保护或私有,但它并没有解决任何问题。帮助,任何人?

回答

4

由于说话()原本是公开的,你需要保持公众。您“无法更改访问修饰符”(公共与私人)。

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

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

+0

所以Dog类需要有“public override void speak()”,而Pet类有“public virtual void speak(string s)”?这就是我现在的情况,它仍然会给出同样的错误。字符串是否有所作为? – user1831281

+0

签名必须匹配;由于'Pet'具有'public virtual void speak(string s)',所以Dog必须具有'public override void speak(string s)'。请参阅Joe的链接。 –

+0

如果您使用Visual Studio,则Intellisense会向您显示您在键入“覆盖”时可以覆盖的方法,然后按Tab键。如果你想重写的方法不在列表中,这很可能是因为它没有以可被重写的方式声明。您只能覆盖Abstract或Virtual方法(并且可以覆盖覆盖...) – Joe

0
protected override void speak() 
    { 

    } 

敢肯定这是因为你在子类中改变public方法protected

有错误告诉你,重写该方法时无法更改访问类型。因此,要解决这个问题只保留方法公众CatDog

public override void speak() 
    { 

    } 
1

的说话方法必须在你的基类的虚拟覆盖

宠物类

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

,你必须使用相同的修改(公)

狗类

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

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

+0

重写的基本方法必须是虚拟的,抽象的或重写的,否则您无法重写。 – Joe