NO5 Typescript 中类的基础用法,继承,修饰符,静态方法,多态以及抽象类

361 阅读2分钟
// 1 基础用法

/**

 * class Person {

        name: string; // 属性,前面省略了public关键词

        constructor(n:string) { // 构造函数,实例化类的时候触发的方法

            this.name = n

        }

        run():void{

            alert(this.name)

        }

    }

    var p = new Person('张三')

    p.run()

*/

// 2 升级用法

/**

 * class Person {

        name: string; // 属性,前面省略了public关键词

        constructor(n:string) { // 构造函数,实例化类的时候触发的方法

            this.name = n

        }

        getName():string{

            return this.name

        }

        setName(name:string):void{

            this.name = name

        }

    }

    var p = new Person('张三')

    alert(p.getName())

    p.setName('李四')

    alert(p.getName())

*/

// 3 ts中实现继承 extends super

/**

 * class Person {

        name: string; // 属性,前面省略了public关键词

        constructor(n:string) { // 构造函数,实例化类的时候触发的方法

            this.name = n

        }

        run():string{

            return `${this.name} 在运动`

        }

    }

    class Web extends Person{

        constructor(name:string) {

            super(name) // 初始化父类的构造函数

        }

        run():string{ // 当父类和子类有同样的方法,优先子类

            return `${this.name} 在运动--子类`

        }

        work() {

            alert(`${this.name}在工作`)

        }

    }

    var w = new Web('李四')

    alert(w.run())

    // w.work()

*/


// 4类里面的修饰符,ts里面定义属性的时候给我们提供了 三种修饰符

/*

public: 公有,在当前类、子类、类外面可以访问(默认修饰符,可以省略)

protected: 保护类型,在当前类、子类可以访问,在类外面无法访问

private: 私有,在当前类可以访问,在子类/类外面无法访问

*/


/*

    class Person {

        // public name: string;

        // protected name: string;

        private name: string;


        constructor(n:string) {

            this.name = n

        }

        run():string{

            return `${this.name} 在运动`

        }

    }

    class Web extends Person{

        constructor(name:string) {

            super(name)

        }

        work() {

            alert(`${this.name}在工作`)

        }

    }

    // 在当前类访问

    var y = new Person('王五')

    alert(y.run())

    // 在子类访问

    var w = new Web('李四1')

    w.work()

    // 在类外部访问

    var z = new Person('张三')

    alert(z.name)

*/

// 5 类里面的静态方法

/*

    class Person {

        name: string

        age: number=20

        static sex="男" // 静态属性

        constructor(name:string) {

            this.name = name

        }

        run(){ // 实例方法,实例化以后才能调用的

            alert(`${this.name}在运动`)

        }

        work(){

            alert(`${this.name}在工作`)

        }

        static print() { // 静态方法

            alert('静态方法') 

            alert('静态方法' + this.age)  // 在静态方法中无法直接调用类里面的属性

            alert('静态方法' + Person.sex)  // 可以调用静态属性

        }

    }

    var p = new Person('张三')

    // p.run()

    Person.print()

*/

// 6 多态: 属于继承,父类定义一个方法不去实现,让继承它的子类去实现,每一个子类有不同的表现

/*

    class Animal{

        name: string

        constructor(name: string) {

            this.name = name

        }

        eat() {

            console.log('eat')

        }

    }

    class Dog extends Animal{

        constructor(name: string) {

            super(name)

        }

        eat() {

            return this.name + '吃狗粮!'

        }

    }

    class Cat extends Animal{

        constructor(name: string) {

            super(name)

        }

        eat() {

            return this.name + '吃老鼠'

        }

    }

    var d = new Dog('dog')

    alert(d.eat())

*/

/**

 *  7 抽象类:  提供其他类继承的基类,不能被直接实例化

 *  用abstract 关键字定义抽象类和抽象方法,抽象类中的抽象方法不包含具体实现并且必须在派生类中实现

 *  abstract 抽象方法只能放在抽象类里面

 *  简而言之: 抽象类和抽象方法用来定义标准,如Animal要求子类必须包含eat方法

 */

abstract class Animal{

    name: string

    constructor(name: string) {

        this.name = name

    }

    abstract eat():any

}

class Dog extends Animal{

    constructor(name: string) {

        super(name)

    }

    eat() {

        return this.name + '吃狗粮!'

    }

}

class Cat extends Animal{

    constructor(name: string) {

        super(name)

    }

    eat() {

        return this.name + '吃老鼠'

    }

}

var d = new Dog('dog')

alert(d.eat())