我正在编写一个简单的程序来理解继承。
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'的定义没有扩展方法' printAnimal'接受类型' ConsoleApplication1.Dog'的第一个参数。可以找到(您是否缺少using指令或程序集引用?)C:\ Users \ hk \ documents \ visual studio 2013 \ Projects \ ConsoleApplication1 \ ConsoleApplication1 \ Program.cs 24 17 ConsoleApplication1
错误2' ConsoleApplication1.Animal不包含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的基类;和狗和猫继承动物。 因为他们继承了动物,所以狗和猫不应该拥有所有的动物定义吗?
答案 0 :(得分:5)
您必须使用一致的命名。在这里,您以大写形式定义PrintAnimal
,但以小写形式调用它。
class Dog : Animal {
public Dog () {
base.Animal("Doggy", AnimalType.Dog);
}
public override void PrintAnimal () {
Console.WriteLine("Bark");
}
}
接下来,C#中的base
构造调用完成如下:
public class Dog {
public Dog () : base("Doggy", AnimalType.Dog) {
}
}
和Cat
相同。
最后,我建议您使用abstract
作为未定义的方法:
abstract class Animal {
//...
public abstract void PrintAnimal ();
}
因此,编译器将检查您是否对该方法执行了override
以减少不一致性(例如,忘记覆盖,覆盖具有几乎相同名称的其他方法等)。
abstract class
阻止程序员“构建动物”这是合理的,因为不存在Animal
个,只有Cat
和Dog
被分组为动物
答案 1 :(得分:2)
printAnimal
不与PrintAnimal
相同。修复函数名称的大小写。
static void Main(string[] args) {
Dog dog = new Dog();
dog.PrintAnimal(); // NOT printAnimal !!
}