什么是多态?为什么要使用多态?什么时候用多态?多态是如何实现的?使用多态有什么好处?

  在学习《大话设计模式》的时候经常会遇到多态,但什么是多态?为什么要使用多态?什么时候用多态?多态是如何实现的?使用多态有什么好处?我们将根据以上五个问题展开激烈的讨论。

什么是多态?

  多态,顾名思义指“多种形态”。多态表示不同的对象可以执行相同的动作,但要通过它们自己的实现代码来执行。

例:猪、狗、猫都属于动物类,我们将动物类作为父类,猪“哼哼叫”,狗“汪汪叫”,猫“喵喵叫”,猪、狗、猫三者都能叫,但三者都要通过重写父类的方法才能实现。

为什么要使用多态?使用多态有什么好处?

  我们知道,封装可以隐藏实现细节,使得代码模块化;继承可以扩展已存在的代码模块(类);它们的目的都是为了——代码重用。

代码重用,也称代码复用, 就是说你把一个功能写成一个模块, 以便再次需要相同功能的时候,可以直接使用,而不用重新开发。
举例: 假如你的网站需要验证码, 你就可以把验证码这个功能单独提取出来以便复用。
通常代码复用是通过类与对象来实现的, 这也是面向对象编程与面向过程编程最主要的区别之一。

  作为面向对象的三大特性之一,多态也有代码重用的功能,还有解决项目中紧耦合的问题,提高程序的可扩展性·。

举例:添加一个子类,继承父类,重写父类的方法。至此,该程序的扩展性得到了提升,而又不需要查看源代码是如何实现的就可以扩展新功能。

什么时候用多态?

  • 方法中的参数
    class Program
    {
        static void Main(string[] args)
        {
            Person p=new Person();
            Audi audi=new Audi();
            p.setDriver(audi);
            p.drive();
            SBenz benz=new SBenz();
            p.setDriver(benz);
            p.drive();
        }
    }

    public abstract class Driver
    {
        public abstract void run();
    }

    class SBenz : Driver
    {
        public override void run()
        {
            Console.WriteLine("大奔");
        }
    }

    class Audi:Driver
    {
        public override void run()
        {
            Console.WriteLine("奥迪");
        }
    }

    class Person
    {
        private Driver driver;
        public Person() { }

        public Person(Driver driver)
        {
            this.driver = driver;
        }

        public void drive()
        {
            driver.run();
        }

        public void setDriver(Driver driver)
        {
            this.driver = driver;
        }
    }
  • 方法的返回类型
    public class CarFactory
    {
        public static Driver createCar(string carName)
        {
            
            if (carName.Equals("Audi"))
            {
                return new Audi();
            }
            else if (carName.Equals("Benz"))
            {
                return new SBenz();
            }
            else
            {
                Console.WriteLine("出门左拐");
                return null;
            }
        }
    }

多态是如何实现的?

  • 父类是抽象类,方法是抽象方法(没有方法体,也不能实例化),子类重写父类的方法
  • 父类中是虚方法(有方法体,能实例化),子类重写父类的方法

小结

  • 虚方法一定要有方法体(哪怕只是大括号),抽象方法一定没有方法体
  • 虚方法可以被子类重写,抽象方法必须被子类重写
  • 如果我们不需要使用父类创建对象,它的存在只是为供子类继承。可以将父类写成抽象(关键字abstract)类,将父类的方法写成抽象方法,子类中的方法仍用关键字override重写
  • 抽象类不能被实例化
  • 多态是指类可以有多种形态,通过修改可以形成多个的实现方法。当子类从父类继承时,它会获得父类的所有方法、字段、属性和事件。若要更改父类的数据和行为,通常有两种选择,第一种是在子类的访问修饰符后加new,就是隐藏了基类(父类)的方法,第二种是在子类中重写父类的方法,更换方法里的内容。

  耐心点,坚强点,总有一天,你承受过的疼痛会有助于你,生活从来不会刻意亏欠谁,它给了你一块阴影,必会在不远的地方撒下阳光。

你可能感兴趣的:(#,C#)