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 getKeyInManager
ve setKeyInManager
değ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 IManagedObject
bir arayüz olduğunu ve uygulama içeremeyeceğini biliyorum, ancak sınıfımın ObjectThatShouldAlsoBeExtended
iç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.