Я хочу сэкономить свое время и повторно использовать общий код для разных классов, который расширяет классы 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, это должно быть возможно, но не с помощью нескольких расширений, поскольку в то время возможно только одно, другого решения я не нашел.