C#之多态

来源:互联网 发布:keil c51keil软件仿真 编辑:程序博客网 时间:2024/05/23 13:39

       一、什么是多态

       简单来说,多态就是对象可以表现多个类型的能力,同一操作作用于不同的对象,可以有不同的解释,产生不同的执行结果。在运行时,可以通过指向基类的指针,来调用实现派生类中的方法。可以把一组对象放到一个数组中,然后调用它们的方法,在这种场合下,多态性作用就体现出来了,这些对象不必是相同类型的对象。当然,如果它们都继承自某个类,你可以把这些派生类,都放到一个数组中。如果这些对象都有同名方法,就可以调用每个对象的同名方法。

       二、几种建立多态的方式

       1、用父类实现多态

       多个类可以从单个基类“继承”。通过继承,类在基类所在的同一实现中接收基类的所有方法、属性和事件。这样,便可根据需要来实现附加成员,而且可以重写基成员以提供不同的实现。

      (1、)使用new修饰符隐藏父类的成员

        在子类中,可用new修饰符隐藏父类的成员,隐藏父类的成员意味着该成员的派生版本将替换基类版本。在不使用 new 修饰符的情况下隐藏成员是允许的,但会生成警告。使用 new 显式隐藏成员会取消此警告,并记录代之以派生版本这一事实。

    class Program    {        static void Main(string[] args)        {            Aniaml a = new Aniaml();            a.Eat();            Dog dog = new Dog();            dog.Eat();            Aniaml animal = dog;  //dog对象赋给animal变量            animal.Eat();  //调用dog的Eat旧方法—父类的方法        }    }    class Aniaml  //定义动物类Animal    {        public void  Eat()        {            Console.WriteLine("动物吃东西");        }    }    class Dog : Aniaml  //定义Dog类,从Animal派生    {        new public void Eat()  //new隐藏父类成员        {            Console.WriteLine("狗吃骨头");        }    }
       可以理解为,使用new关键字后,使得Dog中的Eat方法和Animal中的Eat方法成为毫不相关的两个方法,只是它们的名字碰巧相同而已。

      (2、)使用override重载父类成员实现多态

        virtual供父类的函数成员使用,表明是虚拟的成员

        override供子类的函数成员使用,表明是重载的成员

        父类的虚拟函数可以被重载,其他的成员不可以被重载

    class Program    {        static void Main(string[] args)        {            Dog dog = new Dog();            Cat cat = new Cat();            Aniaml animal = dog ;  //dog对象赋给animal变量            animal.Eat();  //继承的父类方法已被完全覆盖,等价于dog.Eat()            animal = cat;            animal.Eat();  //等价于cat.Eat()        }    }    class Aniaml  //定义动物类Animal    {        public virtual void  Eat()        {            Console.WriteLine("动物吃东西");        }    }    class Dog : Aniaml  //定义Dog类,从Animal派生    {        public override void Eat()         {            Console.WriteLine("狗吃骨头");        }    }    class Cat : Aniaml    {        public override void Eat()        {            Console.WriteLine("猫吃鱼");        }    }
       子类重载父类的虚拟函数,然后由父类变量引用不同子类对象的同名函数,同样的animal.Eat方法,运行结果不同,这是行为多态性。

       2、用抽象类实现多态

       抽象类同时提供继承和接口的元素。抽象类本身不能实例化,它必须被继承。该类的部分或全部成员可能未实现,该实现由继承类提供。已实现的成员仍可被重写,并且继承类仍可以实现附加接口或其他功能。 

    class Program    {        static void Main(string[] args)        {            Dog dog = new Dog();            dog.Eat();            Console.ReadKey();        }    }    public abstract class Aniaml  //定义抽象类Animal    {        public abstract void Eat();  //定义抽象方法Eat    }    class Dog : Aniaml  //定义Dog类,从Animal派生    {        public override void Eat()          {            Console.WriteLine("狗吃骨头");        }    }
       抽象方法只是对方法进行了定义,而没有实现,如果一个类包含了抽象方法,那么该类也必须用abstract声明为抽象类,一个抽象类是不能实例化的。

       3、用接口实现多态

       多个类可实现相同的“接口”,而单个类可以实现一个或多个接口。接口本质上是类需要如何响应的定义。接口描述类需要实现的方法、属性和事件,以及每个成员需要接收和返回的参数类型,但将这些成员的特定实现留给实现类去完成。 

    interface IShout  //定义接口IShout    {        void IShout();    }    class Program    {        static void Main(string[] args)        {            Dog dog = new Dog();            dog.IShout();            Cat cat = new Cat();            cat.IShout();        }    }    class Dog :IShout   //实现接口IShout    {        public void IShout()          {            Console.WriteLine("我会叫");        }    }    class Cat :IShout   //实现接口IShout    {        public void IShout()        {            Console.WriteLine("我也会叫");        }    }
        狗会叫,猫也会叫,它们都有会叫的能力,因此可以通过定义和实现接口来实现功能的添加,也实现了多态性。

      以上是自己关于C#多态的一个简单总结,不断努力,不断进步。。。


0 0
原创粉丝点击