Я хочу сэкономить свое время и повторно использовать общий код для разных классов, который расширяет классы PIXI (2d-библиотека рендеринга webGl).
Объектные интерфейсы:
module Game.Core {
export interface IObject {}
export interface IManagedObject extends IObject{
getKeyInManager(key: string): string;
setKeyInManager(key: string): IObject;
}
}
Моя проблема в том, что код внутри getKeyInManagerи setKeyInManagerне изменится, и я хочу использовать его повторно, а не дублировать, вот реализация:
export class ObjectThatShouldAlsoBeExtended{
private _keyInManager: string;
public getKeyInManager(key: string): string{
return this._keyInManager;
}
public setKeyInManager(key: string): DisplayObject{
this._keyInManager = key;
return this;
}
}
Я хочу автоматически добавить через a Manager.add()ключ, используемый в диспетчере для ссылки на объект внутри самого объекта в его свойстве _keyInManager.
Итак, возьмем пример с текстурой. Вот идетTextureManager
module Game.Managers {
export class TextureManager extends Game.Managers.Manager {
public createFromLocalImage(name: string, relativePath: string): Game.Core.Texture{
return this.add(name, Game.Core.Texture.fromImage("/" + relativePath)).get(name);
}
}
}
Когда я это сделаю this.add(), я хочу, чтобы Game.Managers.Manager add()метод вызывал метод, который существовал бы для объекта, возвращаемого Game.Core.Texture.fromImage("/" + relativePath). Этот объект в данном случае будет Texture:
module Game.Core {
// I must extends PIXI.Texture, but I need to inject the methods in IManagedObject.
export class Texture extends PIXI.Texture {
}
}
Я знаю, что IManagedObjectэто интерфейс и не может содержать реализацию, но я не знаю, что написать, чтобы внедрить класс ObjectThatShouldAlsoBeExtendedвнутри моего Textureкласса. Зная , что тот же процесс будет необходим для Sprite, TilingSprite, Layerи многих других.
Мне нужны опытные отзывы / советы по TypeScript, это должно быть возможно, но не с помощью нескольких расширений, поскольку в то время возможно только одно, другого решения я не нашел.