2012-09-26 44 views
2

我想了解如何在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"); 
     } 
    } 
} 
+1

你究竟想问什么?你能否对你的问题更具体一些? – Lion

+0

我不明白程序员是如何制定出他的代码的,他是如何混合这些类的,那里有一个食物和类的马,然后是哺乳类,那么这个覆盖是做什么的? –

+2

你只需重写类“Eat()”中的方法'Mammal'意味着你正在改变'Animal'类中'Eat()'方法的默认行为。你还在找什么? – Lion

回答

6

好吧,

您已经定义了一个基本类称为哺乳动物,然后创建不同的类型,如动物的哺乳动物,然后具体的动物(马)。

所以每次哺乳动物需要吃东西,所以这就是为什么你已经创建了一个叫做吃职能..

但每一种动物是哺乳动物吃同样的东西?没有!!!

但是每个哺乳动物都需要吃东西。

所以在那个地方override属性来得心应手,它可以让你覆盖的“吃”,所以你将能够指定什么吃的每一个特定的动物的基本功能。

所以,当你创建一个狗类,你会覆盖吃的功能和谁吃一些狗粮规定。

但是因为所有的特定的动物也都是动物,你可以称它们为动物和打印功能吃饭。

可以说你想看看有什么吃的每一种动物。您将创建一个动物列表循环并打印吃饭功能。

,因为你已经覆盖吃饭功能,并规定每一个食品。你会得到每只动物的正确食物。

我是否让自己清楚?

例如看到这个代码

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()); 
      } 
+2

'Response.Write()'(ASP.NET)... ??? – Lion

+4

@Lion +1,'Console.WriteLine'似乎比'Response.Write'更合适 – danludwig

5

override是在C#中的关键词,说:“嘿,我要去做这件事情不同于我的基地(父)类。”它与polymorphism有关。

在发布的代码的情况下,你有一个类层次结构。 A MammalAnimal的特定类型。所以我们可以说哺乳动物继承动物基类Mammal : Animal)。

Animal基类中,有virtual成员(如public virtual void Eat)。这些虚拟中的任何一个都可以在更派生的类中重写。

当您在更多派生类中使用虚拟属性或方法时,您的意思是“当有人使用此属性或方法时,如果对象是哺乳动物的实例,动物或其他某种动物(如鸟,鱼或爬行动物)“。

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了在抽象基类中声明为abstract类型。覆盖abstract的工作原理与覆盖virtual几乎相同,只是没有定义基础实现(仅定义了基础签名已定义)。

0

什么是的用途public override void Eat(Food food)我的意思是说它有什么作用?

在基类中,Eat方法已被标记为虚拟。这意味着它可以被任何继承它的类重新实现。这就是代码的作用:

public override void Eat(Food food) 

它定义了继承类的Eat方法。

+1

这是不正确的。你在想'抽象'。 'virtual'意味着方法调用向下流动,以便使用实际的实现。 –

+0

我的坏 - 我不清楚,所以我编辑了我的帖子。通常会重新实现虚拟方法,但是定义了基本行为。虽然抽象需要定义,但没有定义初始实现。 –

1

重写提供了类改变特定方法实现方式的能力。

从阅读示例代码,所有Animal s可以出生,可以死亡,并且可以吃食物。类别MammalHorse中的替代允许不同的功能。吃吃的方式可以与吃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)实现。

1

Blockquote public override的用途void Eat(Food food)我的意思是说它有什么作用?

哺乳动物是一类动物。哺乳动物将继承动物所有的属性和方法,如果动物是一个抽象类,那么动物就具有并且必须实现动物中抽象的所有内容。所有抽象的手段是,它只是一个框架,迫使子类实现抽象类知道它们必须具有的功能才能正常工作。

哺乳动物有一种方法,食物,这是特定于它的类,并指出是不同于其他所有动物做的。尽管所有的动物都可以在定义为食物的基类动物中使用某种方法,但哺乳动物将始终使用自己的方法 - 这就是覆盖的含义。

所以审查:

Mammal someMammal = new Mammal(); 
someMammal.Eat(new Food()); 

吃的版本将被称为是哺乳动物的在这种情况下吃。现在

,如果我们这样做:这里

Animal someAnimal = new Animal();--must be non-abstract 
someaAnimal.Eat(new Food()); 

我们称之为吃动物的版本。

现在如果我们做到了这一点?

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!? 

那么,因为哺乳动物的食物是一个覆盖,哺乳动物的吃法将被再次调用。如果它没有被覆盖,我们会得到动物的。

仅供参考,以了解有关覆盖,基础/派生类和虚拟类的更多信息。 http://msdn.microsoft.com/en-us/library/ms173152%28v=vs.80%29.aspx