您现在所在的位置:首页 >学习资源 > Unity游戏/VR/AR入门教材 > VR开发入门教程24:面向对象之多态

VR开发入门教程24:面向对象之多态

来源:奇酷教育 发表于:

多态多态(polymorphism)即一个名字具有多种语义。在面向对象中指一个方法可以有多种实现版本。类的多态表现为方法的多态,方法的多态主要有

多态
多态(polymorphism)即一个名字具有多种语义。在面向对象中指一个方法可以有多种实现版本。类的多态表现为方法的多态,方法的多态主要有重载(overload)和覆盖(override)。
重载是同一个类中,有多个方法同名,但是参数列表不同
参数列表不同:
1.参数的个数不相同
2.参数的类型不同
3.参数的次序不同
 
注意:返回值类型不同无法确定重载
 
 
覆盖(重写)是子类中定义了父类同名方法,且参数列表和返回值相同
 
1.父子类内部
2.父类的方法virtual修饰一下 形成虚方法或者为抽象方法:abstract修饰
3.子类中的方法务必和父类的方法同名 override关键字修饰一下
4.其他的通通一样(访问修饰符 修饰符 返回值类型 参数列表)

编译时多态
同名方法构成重载的条件
参数列表不同(包括参数的个数、类型、不同类型参数的顺序),方法的返回值不能构成重载的条件
静态联编(静态多态性)
它是C#的编译时特性。即在编译用户的程序代码时就将对某一方法的调用与对应的具体方法体相互联系起来,生成最终的程序代码
同名的方法由于参数列表不同,在编译时就可以根据调用方法的形式确定到底执行哪个方法的代码,因此这种方法的同名是允许的
 
运行时多态
同名方法构成覆盖的条件:
1、方法分别在父、子类中定义
2、父类中的方法用virtual修饰
3、子类中的方法用override修饰
4、同名 同参 同返回值类型
运行时多态性是C#的运行时的特性。即在编译用户的程序代码时不将对某一方法的调用与对应的具体方法体相互联系起来,而是在执行过程中依据对象的实际类型相应地生成对该对象所在类中的方法最终调用的程序代码。
 
由于调用方法的引用可能指向父类或子类的对象(见上转型对象),因此可以根据“是谁的对象就调用谁的方法”的原则确定调用同名方法中的哪一个,因此在父、子类中定义同名、甚至参数列表相同的方法是允许的。当然,确定调用方法的引用指向父类还是子类的对象在编译时无法完成,只能在运行时确定。
重载和覆盖的区别
从方法声明角度:重载的两个函数参数列表不同;覆盖的两个方法参数列表和返回值相同
从所处位置角度:重载的两个方法在同一类中;覆盖的两个方法在有继承关系的两个类中
从方法调用角度:重载的方法被同一对象使用不同的参数调用;覆盖的方法被不同对象使用相同参数调用。从多态时机角度:重载的方法在编译时多态;覆盖的方法在运行时多态。