TypeScript学习37

Extends子句

Extends用于定义新的子类,子类包括父类的所有属性和方法。

class Animal {
    move() {
        console.log("Move");
    }
}

class Dog extends Animal {
    woof(times: number) {
        for (let i = 0; i < times; i++) {
            console.log("woof!");
        }
    }
}

const dog: Dog = new Dog();
dog.move();
dog.woof(5);


TypeScript学习37

子类可以不仅可以调用自己的woof()方法,也可以调用父类的move()方法。

运行结果如下:


TypeScript学习37

Overriding方法

子类可以重写父类的方法,可以适当改变签名,但是方法签名必须是兼容父类的。

class Animal {
    move() {
        console.log("Move!");
    }
}

class Dog extends Animal {
    move(steps: number) {
        console.log(`Move ${steps} steps!`);
    }
}

const dog: Dog = new 
dog.move(5);


TypeScript学习37

像这样,改变父类的方法声明是不对的。


但是把steps定义为可选参数,就可以保持和父类定义的兼容。

class Animal {
    move() {
        console.log("Move!");
    }
}

class Dog extends Animal {
    move(steps?: number) {
        if(steps) {
            console.log(`Move ${steps} steps!`);
        } else {
            super.move();
        }
    }
}

const dog: Dog = new Dog();
dog.move(5);
dog.move();


TypeScript学习37

运行结果如下:


TypeScript学习37

当然作为一个子类,同样也能赋值给父类类型的变量。

在调用被重写的函数时,就算当前类型时父类类型,一样可以调用子类的方法。

class Animal {
    move() {
        console.log("Move!");
    }
}

class Dog extends Animal {
    move(steps?: number) {
        console.log("Dog move() method is called");
        if(steps) {
            console.log(`Move ${steps} steps!`);
        } else {
            super.move();
        }
    }
}

const dog: Animal = new Dog();
dog.move();


TypeScript学习37

运行结果如下:

TypeScript学习37

发表评论
留言与评论(共有 0 条评论) “”
   
验证码:

相关文章

推荐文章