Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/305.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 继承缺少定义_C#_Visual Studio 2013 - Fatal编程技术网

C# 继承缺少定义

C# 继承缺少定义,c#,visual-studio-2013,C#,Visual Studio 2013,我正在写一个简单的程序来理解继承 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace ConsoleApplication1 { public enum AnimalType { Dog = 0, Cat = 1 } cla

我正在写一个简单的程序来理解继承

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

namespace ConsoleApplication1
{
    public enum AnimalType
    {
        Dog = 0,
        Cat = 1
    }
    
    class Program
    {
        static void Main(string[] args)
        {
            Dog dog = new Dog();

            dog.printAnimal();
        }
    }

    class Animal
    {
        public string AnimalName;
        public AnimalType AnimalType;

        public Animal()
        {
            SetAnimalName ("");
            SetAnimalType (AnimalType.Dog);
        }

        public Animal (string animalName, AnimalType animalType)
        {
            SetAnimalName (animalName);
            SetAnimalType (animalType);
        }

        public virtual void PrintAnimal ()
        {
            Console.WriteLine("Animal::PrintAnimal -> this function should not get called");
        }

        private void SetAnimalName (string animalName)
        {
            this.AnimalName = animalName;
        }

        private void SetAnimalType (AnimalType animalType)
        {
            this.AnimalType = animalType;
        }
    }

    class Dog : Animal
    {
        public Dog ()
        {
            base.Animal("Doggy", AnimalType.Dog);
        }

        public override void PrintAnimal ()
        {
            Console.WriteLine("Bark");
        }
    }

    class Cat : Animal
    {
        public Cat()
        {
            base.Animal("Kitty", AnimalType.Cat);
        }

        public override void PrintAnimal()
        {
            Console.WriteLine("Meow");
        }
    }
}
我得到以下错误:

错误1“ConsoleApplication1.Dog”不包含“printAnimal”的定义,并且找不到接受类型为“ConsoleApplication1.Dog”的第一个参数的扩展方法“printAnimal”。是否缺少using指令或程序集引用?C:\Users\hk\documents\visual studio 2013\Projects\ConsoleApplication1\ConsoleApplication1\Program.cs 24 17 ConsoleApplication1

错误2“ConsoleApplication1.Animal不包含动物的定义C:\Users\hk\documents\visual studio 2013\Projects\ConsoleApplication1\ConsoleApplication1\Program.cs 65 18 ConsoleApplication1

错误3 ConsoleApplication1。Animal不包含“Animal”的定义C:\Users\hk\documents\visual studio 2013\Projects\ConsoleApplication1\ConsoleApplication1\Program.cs 78 18 ConsoleApplication1

我创建了一个名为animal的基类;狗和猫继承动物。
既然狗和猫继承了动物,那么它们不应该默认拥有所有的动物定义吗?

您必须使用一致的命名。这里您用大写字母定义PrintAnimal,但用小写字母调用它

class Dog : Animal {

    public Dog () {
        base.Animal("Doggy", AnimalType.Dog);
    }

    public override void PrintAnimal () {
        Console.WriteLine("Bark");
    }

}
接下来,C中的基本构造调用如下所示:

public class Dog {

    public Dog () : base("Doggy", AnimalType.Dog) {
    }

}
猫也一样

最后,我建议您对未定义的方法使用抽象:

abstract class Animal {

    //...

    public abstract void PrintAnimal ();

}
因此,编译器将检查您是否对该方法进行了重写,以减少不一致性,例如忘记重写、重写另一个名称几乎相同的方法等


抽象类阻止程序员构造动物这是合理的,因为没有动物,只有猫和狗被归为动物。

必须使用一致的命名。这里您用大写字母定义PrintAnimal,但用小写字母调用它

class Dog : Animal {

    public Dog () {
        base.Animal("Doggy", AnimalType.Dog);
    }

    public override void PrintAnimal () {
        Console.WriteLine("Bark");
    }

}
接下来,C中的基本构造调用如下所示:

public class Dog {

    public Dog () : base("Doggy", AnimalType.Dog) {
    }

}
猫也一样

最后,我建议您对未定义的方法使用抽象:

abstract class Animal {

    //...

    public abstract void PrintAnimal ();

}
因此,编译器将检查您是否对该方法进行了重写,以减少不一致性,例如忘记重写、重写另一个名称几乎相同的方法等

抽象类阻止程序员构造动物这是合理的,因为不存在动物,只有猫和狗被归类为动物。

printAnimal与printAnimal不同。修正函数名的大写

static void Main(string[] args) {
    Dog dog = new Dog();
    dog.PrintAnimal();    // NOT printAnimal !!
}
printAnimal与printAnimal不同。修正函数名的大写

static void Main(string[] args) {
    Dog dog = new Dog();
    dog.PrintAnimal();    // NOT printAnimal !!
}

大写/小写issuedog.printAnimal应该是dog.PrintAnimalpublic enum AnimalType为什么需要跟踪它是什么类型的动物?类型告诉你。如果myAnimalVariable是Dog Console.WriteLineHello,则这是Dog。;如果我想申报我自己的动物怎么办。现在我没有双关语,因为我不能更新你的枚举。那些没有双关语的人几乎总是想要双关语:--@ta.speot.is:这个话题当然有争议。但在大学里,我们了解到操作符的实例是对糟糕设计的警告。您应该尝试使用动态绑定。大写/小写issuedog.printAnimal应该是dog.PrintAnimalpublic enum AnimalType为什么需要跟踪它是什么类型的动物?类型告诉你。如果myAnimalVariable是Dog Console.WriteLineHello,则这是Dog。;如果我想申报我自己的动物怎么办。现在我没有双关语,因为我不能更新你的枚举。那些没有双关语的人几乎总是想要双关语:--@ta.speot.is:这个话题当然有争议。但在大学里,我们了解到操作符的实例是对糟糕设计的警告。您应该尝试使用动态绑定。