[Unity] C#中级编程 - 07 - 多态
Posted L建豪 忄YH
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[Unity] C#中级编程 - 07 - 多态相关的知识,希望对你有一定的参考价值。
[Unity中文课堂教程] C#中级编程 - 07 - 多态
原教程视频地址:
《[Unity中文课堂教程预告片] C#中级编程_哔哩哔哩_bilibili》
《C# 多态性 | 菜鸟教程 (runoob.com)》,菜鸟教程中提到多态,但指的是方法重载和覆写操作。和视频教程里指的不是一个东西。
内容短小精悍简练,每节只有几分钟。很适合用来预习和复习。
多态
多态是继承的一个特征,允许类拥有多个类型。在继承层次结构中,任何子类都可以称为父类,这表示在需要基类的时候。可以用派生类来代替它。(unity中常用的技巧)
-
(
我不是很懂定义,但我感觉这种语法特性很好用。)类也算一种类型,属于继承的一部分。 -
在unity中常用:只需要调用组件的通用功能,不需要特定功能时,可以将参数类型设置为基类。比如:胶囊碰撞器、盒装碰撞器、圆形碰撞器等,都继承了碰撞器的派生类。
脚本①:
public class Exercise_4_12 // 基类
public Exercise_4_12() // 构造函数
num_1 = 121; // 初始化
Debug.Log("E_4_12 实例化");
public int num_0 = 120; // 局部属性
public virtual int num_1get;set; // 虚拟属性
public void get_num_0() // 局部方法
Debug.Log("E_4_12 : " + num_0);
/* 如果这个命名为 get_num_1 会报错,不知道为什么 */
public virtual void get_num_10() // 虚拟方法
Debug.Log("E_4_12 : " + num_1);
脚本②:
public class Exercise_4_13 : Exercise_4_12 // 派生类
public Exercise_4_13() // 构造函数
num_1 = 131;
Debug.Log("E_4_13 实例化");
new public int num_0 = 130; // 隐藏基类属性
public override int num_1get;set; // 覆盖基类属性
new public void get_num_0() // 隐藏基类方法
Debug.Log("E_4_13 : " + num_0);
/* 如果这个命名为 get_num_1 会报错,不知道为什么 */
public override void get_num_10() // 覆盖基类方法
Debug.Log("E_4_13 : " + num_1);
public void get_str() // 派生类独有,基类没有
Debug.Log("E_4_13 : " + "子类独有");
脚本③:
public class Exercise_4_14 : MonoBehaviour
void Start()
Exercise_4_12 myClass_1212 = new Exercise_4_12(); // E412 实例化
myClass_1212.get_num_0(); // E412 120
myClass_1212.get_num_10(); // E412 121
Exercise_4_12 myClass_1213 = new Exercise_4_13(); // E412/E413 实例化
myClass_1213.get_num_0(); // E412 120、局部方法调用局部
myClass_1213.get_num_10(); // E413 131、虚拟方法调用最新的覆盖
Debug.Log("E_4_12 : " + myClass_1213.num_1); // E412 131、虚拟属性调用最新的覆盖
// Exercise_4_13 myClass_1312 = new Exercise_4_12(); 编译报错,只允许基于父类创建子类
Debug.Log("------ 分界线 -------");
Exercise_4_13 myClass_1313 = (Exercise_4_13)myClass_1213;// 适用类型转换,类似(int)
myClass_1313.get_num_0(); // E413 130、和原来不一样
myClass_1313.get_num_10(); // E413 131
myClass_1313.get_str(); // 子类独有、可以调用
// Exercise_4_13 myClass_1312 = (Exercise_4_13)myClass_1212;// 编译没错,运行报错
- 总结:
- 创建对象时可以用父类对象接收子类对象,传参同理。这种现象称为多态。
- 不可反向使用子类对象接收父类对象,编译报错。
- 接收后的父类对象,对于普通的局部方法只会调用父类中的。但是覆盖的属性和方法都会调用最新子类中的。
- 实例化对象也支持类型转换,类似 “强制数据转换” 的形式。有限定条件,只能是原本接收的是子类,才可以转换回子类。不然运行时报错:
Specified cast is not valid.
(指定的演员表无效) - 转换类的类型后,可调用子类的局部对象和属性,含原本父类没有的也可以调用。
在unity中,经常用到多态,传参时特别注意兼容性。使用基类传参更加多样化。
以上是关于[Unity] C#中级编程 - 07 - 多态的主要内容,如果未能解决你的问题,请参考以下文章
[Unity] C#中级编程 - 10 - 命名空间/using
[Unity] C#中级编程 - 10 - 命名空间/using