Eu quero economizar meu tempo e reutilizar o código comum entre as classes que estende as classes PIXI (uma biblioteca de renderizador 2d webGl).
Interfaces de objeto:
module Game.Core {
export interface IObject {}
export interface IManagedObject extends IObject{
getKeyInManager(key: string): string;
setKeyInManager(key: string): IObject;
}
}
Meu problema é que o interior de código getKeyInManager
e setKeyInManager
não vai mudar e eu quero reutilizá-lo, não duplicá-lo, aqui é a implementação:
export class ObjectThatShouldAlsoBeExtended{
private _keyInManager: string;
public getKeyInManager(key: string): string{
return this._keyInManager;
}
public setKeyInManager(key: string): DisplayObject{
this._keyInManager = key;
return this;
}
}
O que quero fazer é adicionar automaticamente, por meio de a Manager.add()
, a chave usada no gerenciador para fazer referência ao objeto dentro do próprio objeto em sua propriedade _keyInManager
.
Então, vamos dar um exemplo com uma textura. Aqui vai oTextureManager
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);
}
}
}
Quando eu fizer isso this.add()
, quero que o Game.Managers.Manager
add()
método chame um método que existiria no objeto retornado por Game.Core.Texture.fromImage("/" + relativePath)
. Este objeto, neste caso, seria um Texture
:
module Game.Core {
// I must extends PIXI.Texture, but I need to inject the methods in IManagedObject.
export class Texture extends PIXI.Texture {
}
}
Eu sei que IManagedObject
é uma interface e não pode conter implementação, mas não sei o que escrever para injetar a classe ObjectThatShouldAlsoBeExtended
dentro da minha Texture
classe. Sabendo que seria necessário o mesmo processo para Sprite
, TilingSprite
, Layer
e muito mais.
Preciso de um feedback / conselhos experientes do TypeScript aqui, deve ser possível fazer isso, mas não por extensões múltiplas, pois apenas uma é possível no momento, não encontrei nenhuma outra solução.