继承需要get或set访问器

时间:2016-10-26 22:39:29

标签: c#

我想看看是否会覆盖方法树皮。

出于某种原因,当我尝试使用a.bark从main调用方法bark时,我得到错误是一个get或set accessor,另一个错误。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace animals
{
    class Animal
    {
        public void bark {             
            Console.WriteLine("woohhoo");            
        }        
    }    

    class dog : Animal
    {        
      public void bark    
      {
         Console.WriteLine("woof");
      }    
    }

    class Program
    {
        static void Main(string[] args)
        {
            Animal a = new Animal();

            a.bark;

            dog d = new dog();

            d.bark;  
        }
    }
}

3 个答案:

答案 0 :(得分:0)

您在方法声明中缺少括号:

  

此处:查看this fiddle

您应该在C#中使用()声明方法,并使用方法名后面的括号来调用它们:a.bark();

class Animal
{

    public void bark() { 
        Console.WriteLine("woohhoo");
    }
}


class dog : Animal
{
  public void bark()
  {
     Console.WriteLine("woof");
  }
}

这样称呼:

public static void Main()
{
    Animal a = new Animal();

    a.bark();
    dog d = new dog();
    d.bark();
}

此外,不,该方法不会覆盖,因为在C#中,如果您希望派生类型覆盖基类中的方法,则必须在基类中使用virtual标记该方法并在派生类上覆盖它。

考虑像this fiddle一样重构代码。请注意,现在您可以在Animal变量中创建dog并正确调用方法。

Animal d = new dog();
d.bark();

答案 1 :(得分:0)

覆盖你需要一个虚拟功能。您还需要功能括号。如果你没有括号,它认为这是一个属性

具有基本形式: -

public void talk
{
   get { return somevariable; }
   set { somevariable = value}
}

这就是为什么它告诉你它需要获取或设置

在Animal上称它为'bark'也很奇怪。所以改变一下,你想要的是: -

class Animal
{
    public virtual void talk() { 
        Console.WriteLine("woohoo");
    }
}

class dog : Animal
{
  public override void talk()
  {
     Console.WriteLine("woof");
  }
}

class Program
{
    static void Main(string[] args)
    {
        Animal a = new Animal();

        a.talk();

        dog d = new dog();

        d.talk();

        // this part is key, when you have a dog as an animal, when you 
        // call talk it will use the overriden method.  If you don't have
        // virtual and override, then this would go "woohoo"
        Animal da = d;
        da.talk();
    }
}

答案 2 :(得分:0)

如评论中所述,你需要在树皮后加上括号 C#在覆盖方面为您提供了几个选项。给出以下主要方法。

static void Main(string[] args)
{
    Animal a = new Animal();
    a.bark();
    dog d = new dog();
    d.bark();
}

如果考虑以下类(版本A),则此技术称为隐藏。狗的树皮方法隐藏了Animal's。注意狗的树皮方法前的新关键字。

class Animal {
    public void bark (){ 
        Console.WriteLine("woohhoo");
    }
}

class dog : Animal {
  public new void bark() {
     Console.WriteLine("woof");
  }
}

output
    woohhoo
    woof

现在考虑下面的类(版本B),其中狗的树皮方法覆盖动物的。

class Animal {
    public virtual void bark (){ 
        Console.WriteLine("woohhoo");
    }
}

class dog : Animal {
    public override void bark() {
       Console.WriteLine("woof");
    }
}

输出相同。那有什么区别?更改main方法如下,并使用版本A和版本B运行代码。

static void Main(string[] args)
{
    Animal a = new Animal();
    a.bark();
    Animal d = new dog();
    d.bark();
}

Version A output
    woohhoo
    woohhoo
Version B output
    woohhoo
    woof