打字稿中的子类化
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
}
}
}
我在 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
}
}
}