我试图了解如何在C#中使用或访问多个类,有人可以向我解释这段代码的作用吗?
public class Mammal : Animal
{
public Mammal(String name) : base(name) { }
public override void Eat(Food food)
{
Console.WriteLine("Mammal \"" + Name + "\" eats " + food.Name);
}
}
public override void Eat(Food food)
的目的是什么?我的意思是它做了什么?
namespace ConsoleApplication1
{
public class Food
{
private String name;
Food(String name)
{
this.name = name;
}
public String Name
{
get
{
return name;
}
set
{
name = value;
}
}
}
public class Animal
{
private String name = "no name";
public String Name {
get
{
return name;
}
set
{
name = value;
}
}
private Animal() { }
public Animal(String name)
{
this.name = name;
}
public virtual void Eat(Food food)
{
Console.WriteLine("Animal \"" + Name + "\" eats " + food.Name);
}
public virtual void Born()
{
Console.WriteLine("Animal \"" + Name + "\" is born");
}
public virtual void Die()
{
Console.WriteLine("Animal \"" + Name + "\" is died");
}
}
public class Mammal : Animal
{
public Mammal(String name) : base(name) { }
public override void Eat(Food food)
{
Console.WriteLine("Mammal \"" + Name + "\" eats " + food.Name);
}
public override void Born()
{
Console.WriteLine("Mammal \"" + Name + "\" is born");
}
public override void Die()
{
Console.WriteLine("Mammal \"" + Name + "\" is died");
}
public virtual void FedMilk(Mammal[] children)
{
for (Int32 i = 0; i < children.Length; i++)
{
Console.WriteLine("Mammal \"" + Name + "\" feds milk child \"" + children[i].Name + "\"");
}
}
}
public class Horse : Mammal
{
public Horse(String name) : base(name) { }
public override void Eat(Food food)
{
Console.WriteLine("Horse \"" + Name + "\" eats " + food.Name);
}
public override void Born()
{
Console.WriteLine("Horse \"" + Name + "\" is born");
}
}
}
答案 0 :(得分:6)
确定,
你已经定义了一个名为哺乳动物的基本类,然后你创造了不同类型的哺乳动物,如动物,然后是特定的动物(马)。
所以每个哺乳动物都需要吃,所以你为什么要创造一个名为eat的功能。
但每只哺乳动物都会吃同样的东西吗? NO !!!
但是每个哺乳动物都需要吃东西。
因此,在那个地方,覆盖属性很方便,它允许你覆盖“吃”的基本功能,这样你就可以指定每种特定动物吃什么。
因此,当你创建一个狗类时,你将覆盖吃功能并指定谁吃一些狗食。
但是因为你所有特定的动物都是动物,你可以将它们称为动物并打印食物功能。
让我们说你想看看每只动物吃什么。你将创建一个动物列表循环并打印eat函数。
因为你已经覆盖了eat函数并指定了每一种食物。你会得到每只动物的正确食物。
我能让自己清楚吗?例如,请参阅此代码
List<Animal> animals = new List<Animal>();
Horse hr = new Horse();
Dog dg = new Dog();
Bird br = new Bird();
animals.Add(hr);
animals.Add(dg);
animals.Add(br);
foreach(var animal in Animals)
{
Console.WriteLine(animal.eat());
}
答案 1 :(得分:5)
override
是C#中的一个关键字,上面写着“嘿,我想做的事情与我的基础(父级)类不同。”它与polymorphism有关。
如果已发布代码,则您有类层次结构。 Mammal
是特定类型的Animal
。所以我们可以说哺乳动物继承自动物基类(Mammal : Animal
)。
在Animal
基类中,有virtual
个成员(如public virtual void Eat
)。任何这些虚拟成员都可以在更加派生的类中重写。
当您override
更多派生类中的虚拟属性或方法时,您会说“当有人使用此属性或方法时,如果该对象是Mammal的实例,则执行与实例不同的操作。是一种基本的动物,或其他一些动物(如鸟类,鱼类或爬行动物)“。
Animal beaver = new Mammal("beaver"); // "Mammal beaver"
Animal finch = new Bird("finch"); // "Bird finch"
Animal japaneseHuman = new Mammal("Japanese human"); // "Mammal Japanese human"
Animal godzilla = new Reptile("godzilla"); // "Reptile godzilla"
beaver.Eat(new Food("wood")); // "eats wood"
finch.Eat(new Food("nuts")); // "eats nuts"
japaneseHuman.Eat(new Food("whale")); // "eats whale"
godzilla.Eat(new Food("Japanese people")); // "eats Japanese people"
您还可以在抽象基类中声明为override
的{{1}}种类型。覆盖abstract
几乎就像覆盖abstract
一样,除了没有定义基本实现(只定义了基本签名)。
答案 2 :(得分:1)
覆盖使类能够更改特定方法的实现方式。
通过阅读示例代码,所有Animal
都可以诞生,可以死亡,并且可以吃食物。 Mammal
和Horse
类中的覆盖允许不同的功能。 Horse
吃的方式与Dog
吃的方式有所不同。
方法是虚拟的这一事实允许颂歌,例如:
Animal[] animals = new Animal[] { new Horse(), new Dog(), new Mammal() };
foreach (Animal animal in animals)
{
animal.Born();
animal.Eat(new Food());
animal.Die();
}
上面的每个调用都会向下流动,并会调用Horse.Born()
或Dog.Eat(Food)
实现。
答案 3 :(得分:1)
Blockquote公共覆盖的目的是什么无效Eat(食物食品)我的意思是做什么?
哺乳动物是一类动物。如果Animal是一个抽象类,Mammal将继承Animal所有的属性和方法,并且必须具有Animal中抽象的所有实现。所有抽象的方法都是它只是一个框架来强制子类实现抽象类知道它们必须具有的东西才能正常运行。
哺乳动物有一种方法,食物,这是特定于它的类,并注意到与所有其他动物不同。尽管所有动物都可能在为食物定义的基类动物中有一种方法,但哺乳动物总会使用自己的方法 - 这就是覆盖的意思。
所以要审查:
Mammal someMammal = new Mammal();
someMammal.Eat(new Food());
在这种情况下,将被称为“哺乳动物吃”的版本。
现在,如果我们这样做了:
Animal someAnimal = new Animal();--must be non-abstract
someaAnimal.Eat(new Food());
这里我们称之为动物版的Eat。
现在怎么做呢?
Mammal someMammal = new Mammal();
someMammal.Eat(new Food());--no surprise we get mammal's eat
Animal someAnimal = (Animal)someMammal;
someAnimal.Eat(new Food());--but what happens here!?
嗯,因为哺乳动物的吃法是一种改写,哺乳动物的吃法会被再次召唤。 如果它没有被覆盖,我们就会得到Animal's。
供参考,以了解有关覆盖,基类/派生类和虚拟类的更多信息。 http://msdn.microsoft.com/en-us/library/ms173152%28v=vs.80%29.aspx
答案 4 :(得分:0)
公共覆盖无效食物(食物食品)的目的是什么?我的意思是做什么?
在基类中,Eat方法已标记为虚拟。这意味着它可以由任何继承它的类重新实现。这就是这段代码的作用:
public override void Eat(Food food)
它定义了继承类的Eat方法。