【学习资料】

《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
    
  •