继承所需的get或set访问器

本文关键字:set 访问 get 继承 | 更新日期: 2023-09-27 18:15:02

我想看看方法bark是否会被覆盖。

出于某种原因,我得到了一个get或set访问器所需的错误和另一个错误,当我试图用a.bark从main调用方法bark。

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;  
        }
    }
}

继承所需的get或set访问器

你的方法声明中缺少圆括号:

这里:看看这个小提琴

你应该用()在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,并在派生类中重写它。

考虑像这样重构代码。注意,现在你可以在Animal变量中创建狗,并且正确调用方法。

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

要覆盖你需要一个虚函数。函数也需要括号。如果没有括号它会认为这是一个属性

的基本形式:-

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

这就是为什么它告诉你它想要get或set

还叫它"树皮"是奇怪的动物。所以稍微改变一下,你想要的是:-

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();
    }
}

正如评论中提到的,你需要在bark后面加上括号。
c#在覆盖方面为您提供了几个选项。给出如下主要方法

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

如果你考虑下面的类(版本A),这种技术被称为隐藏。狗叫的方法隐藏动物的。注意狗叫方法前面的新关键字。

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