覆盖
定义:发生在继承关系里面,通过vitrual和override进行实现,函数名和参数相等。
代码如下:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Data
{
public string name;
public int age;
public string gender;
public virtual void Show()
{
Debug.Log("这是某某某的身份信息");
}
}
public class ZhangSan: Data
{
public ZhangSan ()
{
name = "张三";
age = 18;
gender = "男";
}
public override void Show()
{
Debug.Log("这是" + name + "的身份信息");
}
}
public class LiSi: Data
{
public LiSi ()
{
name = "李四";
age = 20;
gender = "男";
}
//public override void Show()
//{
// Debug.Log("这是" + name + "的身份信息");
//}
}
public class InputData: MonoBehaviour
{
public LiSi liSi;
public ZhangSan zhangSan;
private void Start()
{
liSi = new LiSi();
zhangSan = new ZhangSan();
zhangSan.Show();
liSi.Show();
}
}
运行后得到的结果是:
vitrual 函数定义在父类里面,override定义在子类里面,(注意函数名和参数要一样),在调用子类的函数时,如果没有override函数则运行父类的函数,如果有则运行子类的函数。
这个的作用很大,比如在设计敌人的时候,我们希望大部分敌人的一些函数相同,但是有些特殊的敌人需要修改,我们就可以进行这个函数的修改,提高了代码的可维护性。
重载
定义:任何关系里面都可以发生,只要函数名一致,参数不一致。
public class Data
{
public string name;
public int age;
public string gender;
public virtual void Show()
{
Debug.Log("这是某某某的身份信息");
}
public void Show(string name)
{
Debug.Log("名字是"+name);
}
public void Show(int age )
{
Debug.Log("年龄是"+age);
}
}
public class InputData: MonoBehaviour
{
public Data data;
private void Start()
{
data = new Data();
data.Show();
data.Show("zhangsan");
data.Show(20);
}
这个就是重载,也就是在多个同名函数,但是参数不一致,这个可以发生。
结果:
运用的地方同样很多,这里就不赘述了。
this和base
this.变量名,和base.变量名,用法就是这样,大致讲解,this.变量名讲的是所在类的变量,base.变量名讲的是父类的变量,主要是为了区别如果子类和父类定义的变量名相等了,用于区别,这里就不附上代码演示了,自己尝试一下就理解了。