[英]Understanding how to use classes
我試圖了解如何在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");
}
}
}
好,
你定義了一個叫哺乳動物的基本類,然后你創造了不同類型的哺乳動物,如動物,然后是特定的動物(馬)。
所以每個哺乳動物都需要吃,所以你為什么要創造一個名為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());
}
override
是C#中的一個關鍵字,表示“嘿,我想以不同於我的基礎(父級)類來做這件事。” 它與多態性有關 。
在發布代碼的情況下,您有一個類層次結構 。 Mammal
是一種特定類型的Animal
。 所以我們可以說哺乳動物繼承自動物基類 ( 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"
您還可以override
在抽象基類中聲明為abstract
的類型。 覆蓋abstract
工作幾乎就像覆蓋virtual
,除了沒有定義基本實現(只定義了基本簽名 )。
覆蓋提供了類更改特定方法實現方式的能力。
從閱讀示例代碼,所有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)
實現。
Blockquote什么是公共覆蓋的目的void 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!?
好吧,因為哺乳動物的吃是一種超越,哺乳動物吃的方法將被再次召喚。 如果它沒有被覆蓋,我們就會得到動物的。
供參考,以了解有關覆蓋,基類/派生類和虛擬類的更多信息。 http://msdn.microsoft.com/en-us/library/ms173152%28v=vs.80%29.aspx
公共覆蓋的目的是什么無效吃(食物食品)我的意思是它做什么?
在基類中,Eat方法已標記為虛擬。 這意味着它可以由任何繼承它的類重新實現。 這就是這段代碼的作用:
public override void Eat(Food food)
它為繼承類定義了Eat方法。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.