我试图了解如何在C#中使用或访问多个类,有人可以向我解释这段代码的作用吗?
public class Mammal : Animal
{
public Mammal(String name) : base(name) { }
public override void Eat(Food food)
{
Console.WriteLine("Mammal \"" + Name + "\" eats " + food.Name);
}
}
Run Code Online (Sandbox Code Playgroud)
目的是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");
}
}
}
Run Code Online (Sandbox Code Playgroud)
好,
你定义了一个叫哺乳动物的基本类,然后你创造了不同类型的哺乳动物,如动物,然后是特定的动物(马).
所以每个哺乳动物都需要吃,所以你为什么要创造一个名为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());
}
Run Code Online (Sandbox Code Playgroud)
override是C#中的一个关键字,"嘿,我想做的不同于我的基础(父)类." 它与多态性有关.
在发布代码的情况下,您有一个类层次结构.A Mammal是特定类型的Animal.所以我们可以说Mammal继承自Animal base class(Mammal : Animal).
在Animal基类中,有virtual成员(如public virtual void Eat).可以在更派生的类中覆盖任何这些虚拟成员.
当您override在更多派生类中使用虚拟属性或方法时,您会说"当某人使用此属性或方法时,如果该对象是Mammal的实例,则执行的操作与实例是基本Animal或其他实例的操作不同.一种动物(如鸟,鱼或爬行动物)".
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"
Run Code Online (Sandbox Code Playgroud)
您还可以在抽象基类override中声明的类型abstract.覆盖abstract工作几乎就像覆盖一样virtual,除了没有定义基本实现(只定义了基本签名).