[Unity中文课堂教程] C#中级编程 - 07 - 多态
原教程视频地址:
《[Unity中文课堂教程预告片] C#中级编程_哔哩哔哩_bilibili》
《C#中级编程 - Unity中文课堂 (u3d.cn)》
《C# 多态性 | 菜鸟教程 (runoob.com)》,菜鸟教程中提到多态,但指的是方法重载和覆写操作。和视频教程里指的不是一个东西。
内容短小精悍简练,每节只有几分钟。很适合用来预习和复习。
多态
多态是继承的一个特征,允许类拥有多个类型。在继承层次结构中,任何子类都可以称为父类,这表示在需要基类的时候。可以用派生类来代替它。(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);
}
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);
}
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();
myClass_1212.get_num_0();
myClass_1212.get_num_10();
Exercise_4_12 myClass_1213 = new Exercise_4_13();
myClass_1213.get_num_0();
myClass_1213.get_num_10();
Debug.Log("E_4_12 : " + myClass_1213.num_1);
Debug.Log("------ 分界线 -------");
Exercise_4_13 myClass_1313 = (Exercise_4_13)myClass_1213;
myClass_1313.get_num_0();
myClass_1313.get_num_10();
myClass_1313.get_str();
}
}
- 创建对象时可以用父类对象接收子类对象,传参同理。这种现象称为多态。
- 不可反向使用子类对象接收父类对象,编译报错。
- 接收后的父类对象,对于普通的局部方法只会调用父类中的。但是覆盖的属性和方法都会调用最新子类中的。
- 实例化对象也支持类型转换,类似 “强制数据转换” 的形式。有限定条件,只能是原本接收的是子类,才可以转换回子类。不然运行时报错:
Specified cast is not valid. (指定的演员表无效) - 转换类的类型后,可调用子类的局部对象和属性,含原本父类没有的也可以调用。
在unity中,经常用到多态,传参时特别注意兼容性。使用基类传参更加多样化。
|