Zamanımı kazanmak ve PIXI sınıflarını genişleten sınıflar arasında ortak kodu yeniden kullanmak istiyorum (bir 2d webGl oluşturucu kitaplığı).
Nesne Arayüzleri:
module Game.Core {
export interface IObject {}
export interface IManagedObject extends IObject{
getKeyInManager(key: string): string;
setKeyInManager(key: string): IObject;
}
}
Sorunum kod içeriden olmasıdır getKeyInManagerve setKeyInManagerdeğişmeyecek ve ben bunu çoğaltmak için, onu yeniden kullanmak istiyorsanız, buraya uygulamasıdır:
export class ObjectThatShouldAlsoBeExtended{
private _keyInManager: string;
public getKeyInManager(key: string): string{
return this._keyInManager;
}
public setKeyInManager(key: string): DisplayObject{
this._keyInManager = key;
return this;
}
}
Ne yapmak istiyorum otomatik aracılığıyla, eklemektir Manager.add(), nesneye başvuruda yöneticisinde kullanılan anahtar içine kendi özelliğinde nesnenin kendisi _keyInManager.
Öyleyse, Texture ile bir örnek alalım. İşte gidiyorTextureManager
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);
}
}
}
Bunu yaptığımda this.add(), Game.Managers.Manager add()yöntemin döndürdüğü nesnede var olan bir yöntemi çağırmasını istiyorum Game.Core.Texture.fromImage("/" + relativePath). Bu nesne, bu durumda bir Texture:
module Game.Core {
// I must extends PIXI.Texture, but I need to inject the methods in IManagedObject.
export class Texture extends PIXI.Texture {
}
}
Bunun IManagedObjectbir arayüz olduğunu ve uygulama içeremeyeceğini biliyorum, ancak sınıfımın ObjectThatShouldAlsoBeExtendediçindeki sınıfı enjekte etmek için ne yazacağımı bilmiyorum Texture. Aynı süreç için gerekli olacağını bilerek Sprite, TilingSprite,Layer ve daha fazlası.
Burada deneyimli bir TypeScript geri bildirimine / tavsiyesine ihtiyacım var, bunu yapmak mümkün olmalı, ancak birden fazla uzantıyla değil, o anda yalnızca bir tane mümkün olduğu için başka bir çözüm bulamadım.