Typescript中的子类化

时间:2018-08-20 12:07:24

标签: typescript interface subclass

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

我认为,类似

export class MyStorage implements Storage {

public constructor {} ...

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

Balls: {
...
}
}

3 个答案:

答案 0 :(得分:2)

您可以制作MyStorage和抽象类。在MyStorage内部,您可以使用将在MyStorage的所有子类中使用/共享的功能。然后创建扩展MyStorage的具体类,其中将包含该子类的特定功能。

存储界面

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

抽象存储类

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.
}

答案 1 :(得分:2)

您应该考虑这样一个巨大的物体是否有意义。做所有事情的类通常不是一个好主意,您应该将它们分成几个类,每个类都处理特定的对象类型(例如,一个用于Balls的类,一个用于Candies的类等)并使用这些类。如果要共享代码,则可以将其放在基类中(如果没有具体功能,则最好是抽象基类)。一个解决方案可能看起来像这样:

export abstract class MyStorage implements Storage { 

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

export class BallsStorage extends MyStorage { 
}

话虽这么说,如果由于您自己的原因这是不可行的,则可以拆分这样的功能,只是操作符错误,您需要使用Candies初始化=字段不能与:一起使用(:是类型注释,而不是类内部的字段初始化)。这种方法的一个问题是,在对象文字函数内部(例如getCandies),this将引用对象文字(如果您使用常规函数)。最简单的解决方案是使用箭头函数或添加一个额外的owner字段以允许访问包含的类实例。这是示例这两个选项的解决方案:

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
        }
    }
} 

答案 2 :(得分:0)

你不能。 MyStorage是一个类,但是getCandies是一个不是静态的实例方法。