我想看看是否会覆盖方法树皮。
出于某种原因,当我尝试使用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;
}
}
}
答案 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