了解如何使用类

Mil*_*imz 2 c# class

我试图了解如何在C#中使用或访问多个类,有人可以向我解释这段代码的作用吗?

public class Mammal : Animal
{   
    public Mammal(String name) : base(name) { }

    public override void Eat(Food food)
    {
        Console.WriteLine("Mammal \"" + Name + "\" eats " + food.Name);
    }
}
Run Code Online (Sandbox Code Playgroud)

目的是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");
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

Sil*_*agy 6

好,

你定义了一个叫哺乳动物的基本类,然后你创造了不同类型的哺乳动物,如动物,然后是特定的动物(马).

所以每个哺乳动物都需要吃,所以你为什么要创造一个名为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());
            }
Run Code Online (Sandbox Code Playgroud)

  • @Lion +1,`Console.WriteLine`似乎比`Response.Write`更合适 (4认同)

dan*_*wig 5

override是C#中的一个关键字,"嘿,我想做的不同于我的基础(父)类." 它与多态性有关.

在发布代码的情况下,您有一个类层次结构.A Mammal是特定类型的Animal.所以我们可以说Mammal继承自Animal base class(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"
Run Code Online (Sandbox Code Playgroud)

您还可以在抽象基类override中声明的类型abstract.覆盖abstract工作几乎就像覆盖一样virtual,除了没有定义基本实现(只定义了基本签名).