多态

# 如何理解多态

  • 多种形态:对象的多种形态,方法的多种形态。
  • 体现为:子类对象可以通过父类引用,行为的多态体现在重写override、重载和隐藏new。
  • 继承将相关概念的共性进行了抽象,并提供了一种复用方式。多态在共性的基础上,体现类型及行为的个性化。一个行为有多少个不同的实现。
  • 多态的实际含义是:同一操作作用于不同的对象上面,可以产生不同的解释和不同的执行结果。换句话说,给不同的对象发送同一个消息的时候,这些对象会根据这个消息分别给出不同的反馈。
  • 多态的思想实际上是把“做什么”和“谁去做”分离开来,要实现这一点,归根结底先要消除类型之间的耦合关系。
  • 多态最根本的作用就是通过把过程化的条件分支语句转化为对象的多态性,从而消除这些条件分支语句。
  • 将行为分布在各个对象中,并让这些对象各自负责自己的行为,这正是面向对象设计的优点。

# 虚方法

  • 语法:用 virtual 修饰的已经实现的方法,在子类中可以用 override 重写。

  • 语义:表示一个可以在子类中重写的方法。

# 方法重写

  • 方法重写解决父类所定义方法在子类中不适用(虚方法),或没有实现(抽象方法),这样的方法在子类中可以重写,重写是为了满足子类对该方法的不同需求。
  • 三种方法可以重写。1 abstract 修改的方法必须重写,除非子类也是抽象方法。2 virtual 方法可以重写,父类方法和子类方法有不同的实现。3 override 修饰的方法还可以在子类中继续重写,除非被标识为 sealed。
  • 方法重写时必须在方法前加 override 修饰。

# 重写与重载的区别

  • Override:是指方法的重写,C#中可重写abstract、vritual 、override三类方法,重写是子类重写父类的以上三种方法,是动态绑定的,调用速度比方法隐藏慢,但灵活性好,重写本质是对方法表的修改。
  • OverLoad:是指方法的重载,一个类中的多个同名方法,参数列表不同,主要指参数个数或类型不同,重载的目的是为了让实现相似功能的方法用一个名称表示,方便程序员编写和理解代码、可读性好。

重写和重载都是多态的一种体现。

  • 所处位置不同: 重载在同类中 ,重写在父子类中;
  • 定义方式不同: 重载方法名相同 ,参数列表不同 ,重写方法名和参数列表都相同;
  • 调用方式不同: 重载使用相同对象以不同参数调用 ,重写用不同对象以相同参数调用;
  • 多态时机不同: 重载是编译时多态 ,重写是运行时多态。

# 方法重写原理

  • 父类的方法在子类重写后,是子类型将方法表中的方法签名对应的方法所在的地址重写了,重写后,原方法签名项关联到新方法的地址。当引用调用该方法,访问新地址对应的方法。
  • 所以方法重写后,不管是通过父类还是子类的引用,调用方法时,都调用对象真实类型中定义的方法。

# 方法隐藏

  • 解决父类的方法在子类不合适的问题。但是父类的方法不能重写(不是 virtual,abstract,override )。此时可能选择方法隐藏,子类新定义的一个方法,与父类同签名,子类用新定义的方法隐藏掉父类定义的方法。
  • 方法隐藏的语法是在前面加 new 关键字。

# 方法隐藏原理

  • 是在子类方法表中加入一个新项,新项表示的方法签名与继承来的方法签名一致,但在方法表中不能出现相同签名的方法项,所以必须要隐藏掉一个,子类用新项隐藏掉旧项。方法隐藏是在方法表中加新项。
方法重写和方法隐藏原理图

# 动态绑定与静态绑定

  • 绑定:类型与关联方法的调用关系,通俗讲就是一个类型能调用哪些方法。
  • 静态绑定:是指调用关系是在运行前确定的,即编译期间确定。
  • 动态绑定:是指调用关系是在运行期间确定的。
  • 静态绑定因为在编译期确定,不占用运行时间,所以调用速度要比动态绑定快。
  • 动态绑定是在运行期确定,占用运行时间,但是更灵活。动态绑定比静态绑定灵活性要好。
  • 方法重写是动态绑定。
  • 方法隐藏是静态绑定。
  • 静态类型的面向对象语言通常被设计为可以向上转型:当给一个类变量赋值时,这个变量的类型既可以使用这个类本身,也可以使用这个类的超类。
上次更新: 2025/02/15, 13:42:25
最近更新
01
Git问题集合
01-29
02
安装 Nginx 服务器
01-25
03
安装 Docker 容器
01-25
更多文章>
×
×