【学习资料】
《C#图解教程》
(第4~7章)
:
https://www.cnblogs.com/moonache/p/7687551.html
电子书下载:
https://pan.baidu.com/s/1mhOmBG0
所有类的基类
类的实例化、内存分配
类的特性:封装、继承、多态
隐藏基类的成员
struct、class
抽象函数(abstract)、虚函数(virtual)
抽象类(abstract)、接口(interface)
子类重写虚函数后:
不管在父类中调用,还是在子类中调用,执行的都是子类重写后的函数 (Car.Move)
调用父类虚函数的方法:通过
base
关键字调用(
base.Move()
)
注:子类也可不重写父类的虚函数
class Entity
public void AI()
Move();
public virtual void Move() // 虚函数声明 virtual
Debug.Log("Entity.Move");
class Car : Entity
// 重写方法
public override void Move() // 重写虚函数 override
Debug.Log("Car.Move");
}
// 测试Test
void Start()
Entity entity = new Car();
Car car = (Car)entity;
entity.Move(); // 输出:Car.Move
car.AI(); // 输出:Car.Move
子类重写父类虚函数时,不写 override 关键字,编译器也会显示警告(warning)
注:具体执行父类/子类函数,根据调用环境决定(指向对象的引用类型、父类or子类其他函数中进行调用)
测试1:不同引用类型调用Move 、通过AI()函数中调用
class Entity
public void AI()
Move();
public virtual void Move()
Debug.Log("Entity.Move");
class Car : Entity
// 不写override
public void Move()
Debug.Log("Car.Move");
void Start()
Entity entity = new Car();
Car car = (Car)entity;
entity.Move(); // 输出:Entity.Move
entity.AI(); // 输出:Entity.Move
car.Move(); // 输出:Car.Move
car.AI(); // 输出:Entity.Move