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");
        }
    }
}
4

5 に答える 5

6

Ok、

哺乳類と呼ばれる基本クラスを定義し、次に Animal のようなさまざまな種類の哺乳類を作成し、次に特定の動物 ( Horse ) を作成しました。

つまり、すべての哺乳類は食べる必要があるので、なぜ食べるという関数を作成したのか..

しかし、哺乳類であるすべての動物は同じものを食べますか? いいえ!!!

しかし、すべての哺乳類は食べる必要があります。

そこでオーバーライド属性が便利になり、「食べる」という基本機能をオーバーライドできるようになり、特定の動物ごとに何を食べるかを指定できるようになります。

したがって、dog クラスを作成するときは、eat 関数をオーバーライドして、誰がドッグフードを食べるかを指定します。

しかし、特定の動物はすべて動物でもあるため、それらを動物として参照し、食べる関数を出力できます。

すべての動物を食べるものを見たいとしましょう。動物のリストのループを作成し、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());
            }
于 2012-09-26T20:34:13.820 に答える
5

overrideはC#のキーワードで、「ねえ、これを基本(親)クラスとは異なる方法で実行したい」というものです。それはポリモーフィズムと関係があります。

投稿されたコードの場合、クラス階層があります。AMammalは特定のタイプのです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宣言されている型も使用できます。abstractオーバーライドは、基本実装が定義されていない(基本署名abstractのみが定義されている)ことを除いて、オーバーライドとほとんど同じように機能します。virtual

于 2012-09-26T20:37:49.217 に答える
1

オーバーライドは、クラスが特定のメソッドの実装方法を変更する機能を提供します。

サンプルコードを読むことで、すべてAnimalの人が生まれ、死に、そして食べ物を食べることができます。MammalおよびHorseクラスのオーバーライドにより、さまざまな機能が可能になります。食べる方法は、Horse食べる方法とは異なる場合がありますDog

メソッドが仮想であるという事実は、次のようなodeを可能にします。

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)実装を呼び出します。

于 2012-09-26T20:44:18.583 に答える
1

Blockquote public override void Eat(Food food) の目的は何ですか?

Mammals は Animal 型のクラスです。Animal が抽象クラスの場合、Mammal は Animal が持つすべてのプロパティとメソッドを継承し、Animal で抽象化されているすべてのものを実装する必要があります。すべての抽象手段は、適切に機能するために抽象クラスが持つ必要があると認識しているものをサブクラスに実装させるための単なる骨組みに過ぎないということです。

哺乳類には、そのクラスに固有のメソッド Food があり、他のすべての動物が行うこととは異なることが知られています。すべての動物は基本クラスの動物に食物用に定義されたメソッドを持っているかもしれませんが、哺乳類は常に独自のメソッドを使用します。これがオーバーライドの意味です。

レビューするには:

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

この場合、呼び出されるバージョンの eat は Mammal's Eat です。

これを行った場合:

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

さて、Mammal の eat はオーバーライドであるため、哺乳類の eat メソッドが再度呼び出されます。オーバーライドされていなかったら、アニマルのものを取得していたでしょう。

参考までに、オーバーライド、基本/派生クラス、および仮想クラスの詳細を確認してください。 http://msdn.microsoft.com/en-us/library/ms173152%28v=vs.80%29.aspx

于 2012-09-26T20:46:33.373 に答える
0

public override void Eat(Food food)の目的は何ですか?

基本クラスでは、Eat メソッドは仮想としてマークされています。これは、それを継承する任意のクラスで再実装できることを意味します。それが、このコードのビットが行うことです:

public override void Eat(Food food)

継承クラスの Eat メソッドを定義します。

于 2012-09-26T20:39:31.093 に答える