TypeScript 类 第三章 【抽象类,类的高级技巧】

前言

hello world欢迎来到前端的新世界


😜当前文章系列专栏:Typescript
🐱‍👓博主在前端领域还有很多知识和技术需要掌握,正在不断努力填补技术短板。(如果出现错误,感谢大家指出)🌹
💖感谢大家支持!您的观看就是作者创作的动力

抽象类

抽象类做为其它派生类的基类使用。 它们一般不会直接被实例化。 不同于接口,抽象类可以包含成员的实现细节。abstract关键字是用于定义抽象类和在抽象类内部定义抽象方法。

abstract class Animal {
    abstract makeSound(): void;<font></font>
    move(): void {
        console.log('roaming the earch...');<font></font>
    }<font></font>
}<font></font>

抽象类中的抽象方法不包含具体实现并且必须在派生类中实现。 抽象方法的语法与接口方法相似。 两者都是定义方法签名但不包含方法体。 然而,抽象方法必须包含 abstract关键字并且可以包含访问修饰符。

abstract class Department {<font></font>
<font></font>
    constructor(public name: string) {<font></font>
    }<font></font>
<font></font>
    printName(): void {
        console.log('Department name: ' + this.name);<font></font>
    }<font></font>
<font></font>
    abstract printMeeting(): void; // 必须在派生类中实现<font></font>
}<font></font>
<font></font>
class AccountingDepartment extends Department {<font></font>
<font></font>
    constructor() {
        super('Accounting and Auditing'); // constructors in derived classes must call super()<font></font>
    }<font></font>
<font></font>
    printMeeting(): void {
        console.log('The Accounting Department meets each Monday at 10am.');<font></font>
    }<font></font>
<font></font>
    generateReports(): void {
        console.log('Generating accounting reports...');<font></font>
    }<font></font>
}<font></font>
<font></font>
let department: Department; // ok to create a reference to an abstract type
department = new Department(); // error: cannot create an instance of an abstract class
department = new AccountingDepartment(); // ok to create and assign a non-abstract subclass<font></font>
department.printName();<font></font>
department.printMeeting();<font></font>
department.generateReports(); // error: method doesn't exist on declared abstract type


高级技巧

构造函数

当你在TypeScript里声明了一个类的时候,实际上同时声明了很多东西。 首先就是类的 实例的类型。

class Greeter {<font></font>
    greeting: string;
    constructor(message: string) {
        this.greeting = message;<font></font>
    }<font></font>
    greet() {<font></font>
        return "Hello, " + this.greeting;<font></font>
    }<font></font>
}<font></font>
<font></font>
let greeter: Greeter;<font></font>
greeter = new Greeter("world");
console.log(greeter.greet());

这里,我们写了let greeter: Greeter,意思是Greeter类的实例的类型是Greeter。 这对于用过其它面向对象语言的程序员来讲已经是老习惯了。

我们也创建了一个叫做构造函数的值。这个函数会在我们使用 new创建类实例的时候被调用。下面我们来看看,上面的代码被编译成JavaScript后是什么样子的:

let Greeter = (function () {
    function Greeter(message) {
        this.greeting = message;<font></font>
    }<font></font>
    Greeter.prototype.greet = function () {
        return "Hello, " + this.greeting;<font></font>
    };<font></font>
    return Greeter;<font></font>
})();<font></font>
<font></font>
let greeter;<font></font>
greeter = new Greeter("world");
console.log(greeter.greet());

上面的代码里,let Greeter将被赋值为构造函数。我们当调用 new并执行了这个函数后,便会得到一个类的实例。这个构造函数也包含了类的所有静态属性。换个角度说,我们可以认为类具有 实例部分与静态部分这两个部分。

让我们稍微改写一下这个例子,看看它们之前的区别:

class Greeter {
    static standardGreeting = "Hello, there";<font></font>
    greeting: string;<font></font>
    greet() {<font></font>
        if (this.greeting) {
            return "Hello, " + this.greeting;<font></font>
        }<font></font>
        else {
            return Greeter.standardGreeting;<font></font>
        }<font></font>
    }<font></font>
}<font></font>
<font></font>
let greeter1: Greeter;<font></font>
greeter1 = new Greeter();
console.log(greeter1.greet());<font></font>
<font></font>
let greeterMaker: typeof Greeter = Greeter;<font></font>
greeterMaker.standardGreeting = "Hey there!";<font></font>
<font></font>
let greeter2: Greeter = new greeterMaker();
console.log(greeter2.greet());


把类当做接口使用

如上一节里所讲的,类定义会创建两个东西:类的实例类型和一个构造函数。因为类可以创建出类型,所以你能够在允许使用接口的地方使用类。

class Point {
    x: number;
    y: number;
}

interface Point3d extends Point {
    z: number;
}

let point3d: Point3d = {x: 1, y: 2, z: 3};

后言

创作不易,要是本文章对广大读者有那么一点点帮助 不妨三连支持一下,您的鼓励就是博主创作的动力

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

鋜斗

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值