打字稿中的子类化

Subclassing in Typescript

我在 Typescript 中有一个存储 class,它实现了 Storage 接口,比如说 MyStorage。但是它的方法太多了,所以我想用它来代替MyStorage.getCandy - MyStorage.Candies.getCandies。 结构可能看起来如何?

我猜是这样的

export class MyStorage implements Storage {

public constructor {} ...

Candies: {
   getCandies() { ... }
}

Balls: {
...
}
}

你可以制作 MyStorage 和抽象 class。在 MyStorage 中,您可以拥有 used/shared 跨越所有子 class 和我的 MyStorage 的功能。然后创建扩展 MyStorage 的具体 classes,它将包含该子 class.

的特定功能

存储界面

export interface Storage {
    ...abstract interface methods.
}

摘要存储class

export abstract class MyStorage implements Storage {
    ...shared functionality between subclasses of MyStorage
}

具体实现

export class CandiesStorage extends MyStorage {
    ...your Candies specific functionality.
}

export class BallStorage extends MyStorage {
    ...your Ball specific functionality.
}

你不能。 MyStorage 是一个class,但是getCandies 是一个非static 的实例方法。

你应该考虑这么大的物体是否有意义。 类 做所有事情通常不是一个好主意,您应该将它们分成几个 class 部分,每个部分处理特定的对象类型(即一个 class 用于球,一个用于糖果等.) 并使用那些 classes。如果你想共享代码,你可以把它放在一个基础 class 中(如果它没有具体的功能,最好是一个抽象基础 class )。解决方案可能如下所示:

export abstract class MyStorage implements Storage { 

}
export class CandiesStorage extends MyStorage { 
    getCandies() {}
}

export class BallsStorage extends MyStorage { 
}

话虽这么说,如果因为你自己的原因这不可行,你可以这样拆分功能,你只是运算符错误,你需要用[=13初始化Candies字段=] 而不是 :: 是类型注释,而不是 class 中的字段初始化)。这种方法的一个问题是,如果您使用常规函数,在对象字面量函数(例如 getCandies)内部,this 将引用对象字面量。最简单的解决方案是使用箭头函数或添加额外的 owner 字段以允许访问包含的 class 实例。下面是一个解决方案,举例说明了这两种选择:

export class MyStorage implements Storage {

    public constructor (){ }

    Candies = {
        getCandies: () => {
            this.Balls // this refers to MyStorage
        }
    }

    Balls = { 
        owner: this, // capture the owner object in a field
        getBalls() {
            this.owner.Candies // this refers to the Balls objects, but we can use owner to access the container
        }
    }
}