TypeScript - 继承(extends) - 抽象类(abstract)

(function () {
    /**
     * abstract 开头的是抽象类,
     * 抽象类和其他区别不大,只是不能用来创建对象
     * 抽象类专门是让别人继承的的类
     */
   abstract class Animal {
        // 需要先定义,才能在constructor中this指向
        name: string;
        age: number;

        // 构造函数,会在对象创建时调用
        // new Dog() 的时候,就会调用constructor
        constructor(name: string, age: number) {
            /**
             * 在实例方法中,this就表示当前的实例
             * 在构造函数中当前对象就是当前新建的那个对象
             * 可以通过this指向新建的对象中添加属性
             */

            this.name = name;
            this.age = age;
        }

        /**
         * 该方法不适用所有动物,所以可以改为抽象方法
         * 抽象方法使用aabstract开头,没有方法体
         * 抽象方法只能定义在抽象类中,子类必须对抽象方法进行重写
         */
        /*sayHello() {
            console.log(`Dog ${this.name} is barking, woofing...`)
        }*/
        abstract sayHello():void;
    }

    // 定义一个表示够的类
    // 使Dog类继承Animal的属性
    /**
     * Dog extends Animal
     * 此时Animal被称为父类, Dog被称为子类
     * 使用继承后,子类将会继承父类所有的属性和方法
     *  -通过继承可以将多个类中共有的代码卸载一个勒种,这样只需要写一次即可让所有子类都同时有父类中的属性和方法
     *  -如果希望在子类中添加一些弗雷中没有的属性或方法,直接加就好
     *  -如果在子类中添加了和父类方法名一致的方法,则子类方法会覆盖父类方法, 这种子类覆盖父类方法的形式,称之为 方法重写
     */
    class Dog extends Animal {
        run() {
            console.log(`${this.name} is running...`)
        }
        sayHello(){
            console.log(`Dog ${this.name} is barking, woofing...`)
        }
    }

    class Cat extends Animal {
        sayHello() {
            console.log(`Cat ${this.name} is miao....`)
        }
    }


    const dog = new Dog('Tom', 4);
    const cat = new Cat('Max', 3);
    console.log(dog);
    dog.sayHello();
    dog.run();
    cat.sayHello();
})()

 

posted @ 2021-08-06 11:46  鑫仔Alan  阅读(328)  评论(0编辑  收藏  举报