0

私の兄は、ポリモヒズムの例を示すためにこのコードを書いてくれました。しかし、パラメーターから始めて、すべてがどのように機能するかはよくわかりません。誰かがコードを分析して、すべてがどのように連携し、どのように機能するかについて少し教えてもらえますか?

編集:ここに特定の質問があります:哺乳類.Add(new Cat("白雪姫", 1, 0, "白", "青")); 数字は何をしますか?それらの目的は何ですか? また、コードをどのように操作しますか?

namespace ConsoleApplication2
{
    class Program
    {
        static void Main(string[] args)
        {

            List<Mammal> mammals = new List<Mammal>();

            mammals.Add(new Cat("Snow white", 1, 0, "White", "blue"));
            mammals.Add(new HumanFemale("Krysten", 72, 15, "White", "Blue"));
            mammals.Add(new Cat("Larry", 7, 2, "Orange", "Hazel"));
            mammals.Add(new Dog("Walt", 3, 5, "Brown", "Hazel"));
            mammals.Add(new HumanMale("Ryan", 72, 31, "White", "Blue"));
            mammals.Add(new Cat("Blacky", 5, 10, "Black", "Brown"));

            foreach (Mammal m in mammals)
            {
                m.Speak();
                m.Walk();
            }
            Console.ReadKey();
        }
    } // end of Program class declaration




    public abstract class Mammal
    {
        public Mammal(string name, int heightInInches, int age, string color, string eyeColor)
        {
            this.Name = name;
            this.HeightInInches = heightInInches;
            this.Age = age;
            this.Color = color;
            this.EyeColor = eyeColor;
        }

        private int _HeightInInches;
        private int _Age;

        /// <summary>
        /// Gets or sets the age (in years).
        /// </summary>
        public int Age
        {
            get 
            { 
                return _Age; 
            }
            set 
            {
                if (value < 0)
                {
                    throw new Exception("Invalid Age!");
                }
                _Age = value; 
            }
        }

        /// <summary>
        /// Gets or sets the height.
        /// </summary>
        public int HeightInInches
        {
            get 
            { 
                return _HeightInInches; 
            }
            set 
            {
                if (value < 0)
                {
                    throw new Exception("Invalid height!");
                }
                _HeightInInches = value; 

            }
        }

        /// <summary>
        /// Gets or sets the name.
        /// </summary>
        public string Name { get; set; }

        /// <summary>
        /// Gets or sets the skin or fur color.
        /// </summary>
        public string Color { get; set; }


        /// <summary>
        /// Gets or sets the eye color.
        /// </summary>
        public string EyeColor { get; set; }


        /// <summary>
        /// Causes the mammal to speak.
        /// </summary>
        public virtual void Speak()
        {
            Console.WriteLine("The mammal spoke.");
        }

        /// <summary>
        /// Causes the mammal to walk.
        /// </summary>
        public virtual void Walk()
        {
            Console.WriteLine("The mammal is walking.");
        }

    } // end of Mammal class declaration


    public class Dog : Mammal
    {
        public Dog(string name, int heightInInches, int age, string color, string eyeColor) 
            : base (name, heightInInches, age, color, eyeColor)
        {
        }

        public override void Speak()
        {
            Console.WriteLine("{0} the Dog says: 'Ruff!'", this.Name);
        }

        public override void Walk()
        {
            if (this.Age == 0)
            {
                Console.WriteLine("{0}, the {1} newborn puppy was just born and is too little to walk yet!", this.Name, this.Color);
            }

            else if (Age > 0 && Age <= 5)
            {
                Console.WriteLine("{0}, the {1} puppy is {2} years old and is running around like a hyper puppy, chewing up all the furniture. Oh nooo!", this.Name, this.Color, this.Age);
            }

            else if (Age > 5 && Age <= 10)
            {
                Console.WriteLine("{0}, the {1} dog is {2} years old and walks conservatively", this.Name, this.Color, this.Age);
            }

            else if (Age > 10)
            {
                Console.WriteLine("{0}, the {1} dog is {2} years old and walks very slowly, and has arthiritus in the joints.", this.Name, this.Color, this.Age);
            }
        }

    } // end of Dog class


    public class Cat : Mammal
    {
        public Cat(string name, int heightInInches, int age, string color, string eyeColor)
            : base(name, heightInInches, age, color, eyeColor)
        {
        }

        public override void Speak()
        {
            Console.WriteLine("{0} the Cat says: 'Meow!'", this.Name);
        }

        public override void Walk()
        {

            if (this.Age == 0)
            {
                Console.WriteLine("{0}, the {1} newborn Kitten was just born and is too little to walk yet!", this.Name, this.Color);
            }

            else if (Age > 0 && Age <= 5)
            {
                Console.WriteLine("{0}, the {1} Kitten is {2} years old and is running around like a hyper kitten!", this.Name, this.Color, this.Age);
            }

            else if (Age > 5 && Age <= 10)
            {
                Console.WriteLine("{0}, the {1} cat is {2} years old and walks conservatively", this.Name, this.Color, this.Age);
            }

            else if (Age > 10)
            {
                Console.WriteLine("{0}, the {1} cat is {2} years old and walks very slowly", this.Name, this.Color, this.Age);
            }
        }
    } // end of Cat class

    public abstract class Human : Mammal
    {
        public Human(string name, int heightInInches, int age, string color, string eyeColor)
            : base(name, heightInInches, age, color, eyeColor)
        {
        }


        public override void Walk()
        {

            if (this.Age == 0)
            {
                Console.WriteLine("{0}, the {1} newborn baby was just born and is too little to walk yet!", this.Name, this.Color);
            }

            else if (Age > 0 && Age <= 2)
            {
                Console.WriteLine("{0}, the {1} toddler is {2} years old and is crawling around!", this.Name, this.Color, this.Age);
            }

            else if (Age > 2 && Age <= 5)
            {
                Console.WriteLine("{0}, the {1} kid is {2} years old and is walking around!", this.Name, this.Color, this.Age);
            }

            else if (Age > 5 && Age <= 12)
            {
                Console.WriteLine("{0}, the {1} kid is {2} years old and walks briskly", this.Name, this.Color, this.Age);
            }

            else if (Age > 12 && Age <= 19)
            {
                Console.WriteLine("{0}, the {1} audlt is {2} years old and walks briskly", this.Name, this.Color, this.Age);
            }

            else if (Age > 20 && Age <= 60)
            {
                Console.WriteLine("{0}, the {1} adult is {2} years old and walks conservatively", this.Name, this.Color, this.Age);
            }

            else if (Age > 60)
            {
                Console.WriteLine("{0}, the {1} old person is {2} years old and walks with a cane", this.Name, this.Color, this.Age);
            }
        }

        public  override void Speak()
        {
            Console.WriteLine("The human spoke");
        }
    } // end of Human class

    public class HumanMale : Human
    {
        public HumanMale(string name, int heightInInches, int age, string color, string eyeColor)
            : base(name, heightInInches, age, color, eyeColor)
        {

        }

        public override void Speak()
        {
            if (this.Age == 0)
            {
                Console.WriteLine("{0}, the newborn baby boy was just born and is too young to speak", this.Name);
            }
            if (this.Age > 0 && this.Age <= 3)
            {
                Console.WriteLine("{0}, the toddler boy babbles 'goo goo ga ga'", this.Name);
            }

            if (this.Age > 3 && this.Age <= 5)
            {
                Console.WriteLine("{0}, the toddler boy says, 'I like fire trucks'", this.Name);
            }

            if (this.Age > 5 && this.Age <= 12)
            {
                Console.WriteLine("{0}, the young boy says: I want to be a fireman'", this.Name);
            }

            if (this.Age > 12 && this.Age <= 20)
            {
                Console.WriteLine("{0}, the teenage boy says: I want a girlfriend'", this.Name);
            }

            if (this.Age > 20)
            {
                Console.WriteLine("{0}, the adult male says, 'Hey hey hey!'", this.Name);
            }

        }

    } // end of HumanMale class

    public class HumanFemale : Human
    {
        public HumanFemale(string name, int heightInInches, int age, string color, string eyeColor)
            : base(name, heightInInches, age, color, eyeColor)
        {

        }

        public override void Speak()
        {
            if (this.Age == 0)
            {
                Console.WriteLine("{0}, the newborn baby girl was just born and is too young to speak", this.Name);
            }
            if (this.Age > 0 && this.Age <= 3)
            {
                Console.WriteLine("{0}, the toddler girl babbles 'da da goo goo ga ga'", this.Name);
            }

            if (this.Age > 3 && this.Age <= 5)
            {
                Console.WriteLine("{0}, the girl says 'I wanna be a princess'", this.Name);
            }

            if (this.Age > 5 && this.Age <= 12)
            {
                Console.WriteLine("{0}, the young girl says: I AM a princess'", this.Name);
            }

            if (this.Age > 12 && this.Age <= 20)
            {
                Console.WriteLine("{0}, the teenage girl says: Like, totally. Did you see that other chick? Like, what was she wearing'", this.Name);
            }

            if (this.Age > 20)
            {
                Console.WriteLine("{0}, the adult female says, 'Yep, I'm a woman.'", this.Name);
            }

        }

    } // end of HumanFemale class


} // end of namespace declaration
4

4 に答える 4

1

つまり、Mamalは基本クラスであり、各動物に共通するすべてのプロパティを保持します。

次に、動物(猫、犬)などのクラスを派生させて、これらがベースと同じプロパティを継承するようにします。

ベースは仮想メソッドを使用するため、派生クラスでそれらの機能をオーバーライドできます。

于 2012-06-14T08:31:06.490 に答える
1

EDITの特定の質問について:

mammals.Add(new Cat("Snow white", 1, 0, "White", "blue")); 

この行は次のように書き換えることができます。

Cat aCat = new Cat("Snow white", 1, 0, "White", "blue"); 
mammals.Add(aCat);

最初の行では、Cat のコンストラクターを呼び出しています。

public Cat(string name, int heightInInches, int age, string color, string eyeColor)
            : base(name, heightInInches, age, color, eyeColor)

name として「Snow white」、heightInInches として 1、age として 0、color として「White」、eyeColor として「blue」を渡します。コンストラクターは空です (何もしませんがbase(name, heightInInches, age, color, eyeColor)、同じパラメーターを渡すと呼ばれる Mammal コンストラクター (これが の意味です) に基づいています。これはpublic Mammal(string name, int heightInInches, int age, string color, string eyeColor)が実行されることを意味します。プロパティには、パラメーターとして渡された値があります。

今、あなたは実行します

 mammals.Add(aCat);

ここでは、Cat のインスタンスを Mammal のリストに追加しています。Add は引数として Mammal を想定し、クラスが Mammal から派生しているため、aCat は Mammal であるため、これを行うことができます。

于 2012-06-14T08:43:51.770 に答える
1

Mamal は、すべての犬、猫、人間の女性、人間の男性の一般的なタイプです。すべてに共通のプロパティと機能があります。

public Mammal(string name, int heightInInches, int age, string color, string eyeColor)

この行は mamal クラスのコンストラクターです。プロパティ名、高さ、年齢、色、目の色は、すべての哺乳類に共通です。

すべての哺乳類は歩くことができます (同じ機能を持っています) が、すべて異なる方法で歩きます。したがって、この関数をオーバーライドして、異なる哺乳類に必要な機能を与える必要があります。

public override void Walk() この行は、ウォーク機能をオーバーライドする方法です。

哺乳類クラスは抽象です。つまり、哺乳類という動物は存在しません。それは単に広い定義です。

それが役に立てば幸い。

于 2012-06-14T08:29:39.303 に答える
0

基本的に、あなたの兄弟があなたに見せようとしているのは、親クラスからクラスを派生させると、親クラスのすべてのフィールドとプロパティをさまざまな、通常はより洗練された方法で使用できるということです。それがポリモーフィズムの意味です。

パラメータを使用して、兄弟は、から派生する各クラスがMammal同じパラメータ (名前、身長、年齢、色、目の色) を取るように作成しました。クラスでは、Mammal各パラメーターがそれぞれのプロパティを設定するようにしました。つまり"Bob"、name パラメーターとして渡すとName、 のMammalが Bob になります。他のすべてのクラスに関しては、base()コンストラクターを使用して、哺乳類を と同じ方法で初期化しましたMammal

次に、あなたの兄弟は、実際に行っているメソッドに取り掛かりました。彼はそれらを作成しvirtual、ポリモーフィズムを可能にしました。基本的に、これはどの子クラスもoverrideそれ自体のメソッドを " " または変更できることを示しています。メソッドをオーバーライドすることで、子クラスは「このメソッドを私に使用するときは、私の親クラスの方法ではなく、この方法で使用してください」と言います。彼は、各子クラスのメソッドをオーバーライドし、各子クラスを使用してメソッドを呼び出す (または実行する) ことで、これを示しています。メソッドがオーバーライドされるため、「哺乳類が話している」の代わりに、猫の場合は「meow」、犬の場合は「ruff」が返されます。

また、子クラスはクラスから派生するMammalため、同じプロパティを持つため、すべてMammalに使用できる年齢、身長などがあることに注意してください。あなたの兄弟は、メソッドでこれを使用してカスタマイズしました。

情報量が多いですが、ご理解いただけると幸いです。

于 2012-06-14T08:51:55.267 に答える