C#程序设计自学经典
上QQ阅读APP看书,第一时间看更新

5.4 多态

多态性是指类为名称相同的方法提供不同的实现方式。利用多态性,可以调用类中的某个方法而无须考虑该方法的实现过程。

多态性也是面向对象编程中最重要的特性之一。多态性在运行时,可以通过指向基类的指针,来调用实现派生类中的方法。也可以把一组对象放到一个数组中,然后调用它们的方法,在这种场合下,多态性的作用就体现出来了。本节将具体讲解多态性的有关知识。

当派生类从基类继承时,它会获得基类的所有方法、字段、属性和事件。

在C#中,类的多态性是通过在子类中重写或隐藏基类的方法或函数成员来实现的。下面通过一个小例子来说明方法的重写与隐藏。

例5-9:方法的重写与隐藏(ConsoleOverride)

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    
    namespace ConsoleOverride
    {
        class Program
        {
            static void Main(string[] args)
            {
                Animal animalDog = new Dog();
                Animal animalCat = new Cat();
    
                Dog dog = new Dog();
                Cat cat = new Cat();
    
                animalDog.HasHairy();
                animalDog.Barking();
                dog.Barking();
    
                animalCat.HasHairy();
                animalCat.Barking();
                cat.Barking();
    
                Console.ReadLine();
            }
        }
    
    
        class Animal
        {
            public virtual void HasHairy()
            {
                Console.WriteLine("我是有毛的动物");
            }
    
            public void Barking()
            {
                Console.WriteLine("我叫了一声");
            }
        }
        class Dog : Animal
        {
            public override void HasHairy()
            {
                Console.WriteLine("我是小狗,我是有毛的动物");
            }
    
            public new void Barking()
            {
                Console.WriteLine("我的叫声是汪");
            }
        }
        class Cat : Animal
        {
            public override void HasHairy()
            {
                Console.WriteLine("我是小猫,我是有毛的动物");
            }
    
            public new void Barking()
            {
                Console.WriteLine("我的叫声是喵");
            }
    
        }
    } 

运行结果如图5-9所示。

图5-9 方法的重写与隐藏

在此例中,声明了一个名为Animal的类,Animal类中定义一个名为HasHairy的虚(virtual)方法和一个名为Barking的方法。接着定义了Dog和Cat两个类,并分别继承自Animal类,并分别重写(override)与隐藏(new)了基类中的方法。在Main方法中,分别使用两个子类的对象来实例化父类,并各自实例化子类的对象。并分别调用其HasHairy和Barking方法输出相应信息。

在此需要注意的是,父类中的虚方法必须使用override来重写,而非虚方法则使用了new关键字来隐藏基类的方法。被隐藏的方法,若实例化的是子类的对象,则调用相应子类中的方法,否则调用父类中的方法。