Quiero ahorrar tiempo y reutilizar código común en todas las clases que amplía las clases PIXI (una biblioteca de renderizado webGl 2d).
Interfaces de objetos:
module Game.Core {
export interface IObject {}
export interface IManagedObject extends IObject{
getKeyInManager(key: string): string;
setKeyInManager(key: string): IObject;
}
}
Mi problema es que el código dentro getKeyInManager
y setKeyInManager
no cambiará y quiero reutilizarlo, no duplicarlo, aquí está la implementación:
export class ObjectThatShouldAlsoBeExtended{
private _keyInManager: string;
public getKeyInManager(key: string): string{
return this._keyInManager;
}
public setKeyInManager(key: string): DisplayObject{
this._keyInManager = key;
return this;
}
}
Lo que quiero hacer es agregar automáticamente, a través de a Manager.add()
, la clave utilizada en el administrador para hacer referencia al objeto dentro del propio objeto en su propiedad _keyInManager
.
Entonces, tomemos un ejemplo con una textura. Aquí va elTextureManager
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);
}
}
}
Cuando lo haga this.add()
, quiero que el Game.Managers.Manager
add()
método llame a un método que existiría en el objeto devuelto por Game.Core.Texture.fromImage("/" + relativePath)
. Este objeto, en este caso sería un Texture
:
module Game.Core {
// I must extends PIXI.Texture, but I need to inject the methods in IManagedObject.
export class Texture extends PIXI.Texture {
}
}
Sé que IManagedObject
es una interfaz y no puede contener implementación, pero no sé qué escribir para inyectar la clase ObjectThatShouldAlsoBeExtended
dentro de mi Texture
clase. Sabiendo que sería necesario el mismo proceso para Sprite
, TilingSprite
, Layer
y mucho más.
Necesito comentarios / consejos de TypeScript con experiencia aquí, debe ser posible hacerlo, pero no mediante múltiples extensiones, ya que solo es posible una en ese momento, no encontré ninguna otra solución.