簡體   English   中英

了解如何使用類

[英]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都可以出生,可以死,並可以吃食物。 MammalHorse類中的覆蓋允許不同的功能。 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM