之前在学习java时,就碰到过这个问题,当时一知半解,最近在巩固C#的知识,遇到这个问题,希望本次彻底搞清楚。
劝君莫惜金缕衣,劝君惜取少年时。
——杜秋娘
一、什么是多态?
多态是面向对象的一个重要特征。可以解释为通过继承实现的不同对象调用相同的方法(收到相同的消息时),表现出不同的行为,称之为多态。
C#支持两种类型的多态:
静态多态——也叫编译时的多态。对于非虚成员,在编译时根据参数和返回值类型的不同,加载不同的方法,实现多态。
动态多态——也叫运行时的多态。对于基类虚方法或者抽象方法,在编译时并未确定调用哪个方法,直到运行时才根据情况加载方法(重写“override”)。
二、为什么要有多态?
众所周知,多态是继封装、继承之后的,面向对象的第三个重要基石。而面向对象是面向客观世界存在的对象实体和主观抽象的概念。在现实世界中,存在大量的“不同对象对于同一个消息做出不同的反应”的现象。如cut,对于理发师这个对象来说,他会剪头发;对于医生来说,他会切开患者的皮肤;对于演员来说,他会停止当前的表演行为。所以存在多态就是面向对象本身特征的一个体现。
其次,编译时的多态可以加快运行速度(有待考证),运行时的多态带来了高度灵活和抽象的特点。