[Unity] C#中级编程 - 07 - 多态

Posted L建豪 忄YH

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[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_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;// 编译没错,运行报错
	

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

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

以上是关于[Unity] C#中级编程 - 07 - 多态的主要内容,如果未能解决你的问题,请参考以下文章

[Unity] C#中级编程 - 08 - 接口

[Unity] C#中级编程 - 08 - 接口

[Unity] C#中级编程 - 10 - 命名空间/using

[Unity] C#中级编程 - 10 - 命名空间/using

[Unity] C#中级编程 - 10 - 命名空间/using

[Unity] C#中级编程 - 02 - 静态