У меня есть класс хранения в Typescript, который реализует интерфейс Storage, скажем, MyStorage. Но у него слишком много методов, поэтому я хочу использовать его вместо MyStorage.getCandy - MyStorage.Candies.getCandies. Как структура может выглядеть?

Я предполагаю, что-то вроде

export class MyStorage implements Storage {

public constructor {} ...

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

Balls: {
...
}
}
4
annaoomph 20 Авг 2018 в 15:07

3 ответа

Лучший ответ

Вы должны подумать, имеет ли смысл такой огромный объект. Классы, которые делают все, как правило, плохая идея, вы должны разделить их на несколько классов, каждый из которых имеет дело с определенным типом объекта (т.е. один класс для шаров, один для конфет и т. Д.) И использовать эти классы. Если вы хотите поделиться кодом, вы можете поместить его в базовый класс (предпочтительно абстрактный базовый класс, если он не имеет конкретной функциональности). Решение может выглядеть так:

export abstract class MyStorage implements Storage { 

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

export class BallsStorage extends MyStorage { 
}

При этом, если по вашим собственным причинам это невозможно, вы можете разделить функции следующим образом: у вас просто неверный оператор, вам нужно инициализировать поле Candies с =, а не с { {X2}} (: является аннотацией типа, а не инициализацией поля внутри класса). Одна из проблем этого подхода заключается в том, что внутри литеральных функций объекта (например, 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
        }
    }
} 
4
Titian Cernicova-Dragomir 20 Авг 2018 в 13:26

Вы можете создать MyStorage и абстрактный класс. Внутри MyStorage вы можете иметь функциональность, которая будет использоваться / использоваться всеми подклассами my 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.
}
2
Jason White 20 Авг 2018 в 12:21

Ты не можешь MyStorage - это класс, но get Candies - это экземпляр метода, а не статический.

0
BigTeech 20 Авг 2018 в 12:23
51930410