IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 游戏开发 -> [Unity] C#中级编程 - 07 - 多态 -> 正文阅读

[游戏开发][Unity] C#中级编程 - 07 - 多态

[Unity中文课堂教程] C#中级编程 - 07 - 多态

原教程视频地址:

《[Unity中文课堂教程预告片] C#中级编程_哔哩哔哩_bilibili

C#中级编程 - Unity中文课堂 (u3d.cn)

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_1{get;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_1{get;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;// 编译没错,运行报错
	}
}
  • 总结
  1. 创建对象时可以用父类对象接收子类对象,传参同理。这种现象称为多态。
  2. 不可反向使用子类对象接收父类对象,编译报错。
  3. 接收后的父类对象,对于普通的局部方法只会调用父类中的。但是覆盖的属性和方法都会调用最新子类中的。
  4. 实例化对象也支持类型转换,类似 “强制数据转换” 的形式。有限定条件,只能是原本接收的是子类,才可以转换回子类。不然运行时报错:Specified cast is not valid.(指定的演员表无效)
  5. 转换类的类型后,可调用子类的局部对象和属性,含原本父类没有的也可以调用。

在unity中,经常用到多态,传参时特别注意兼容性。使用基类传参更加多样化。

  游戏开发 最新文章
6、英飞凌-AURIX-TC3XX: PWM实验之使用 GT
泛型自动装箱
CubeMax添加Rtthread操作系统 组件STM32F10
python多线程编程:如何优雅地关闭线程
数据类型隐式转换导致的阻塞
WebAPi实现多文件上传,并附带参数
from origin ‘null‘ has been blocked by
UE4 蓝图调用C++函数(附带项目工程)
Unity学习笔记(一)结构体的简单理解与应用
【Memory As a Programming Concept in C a
上一篇文章      下一篇文章      查看所有文章
加:2021-12-18 16:18:24  更:2021-12-18 16:18:32 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/27 20:23:40-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码