Tôi muốn tiết kiệm thời gian của mình và sử dụng lại mã chung trên các lớp mở rộng các lớp PIXI (thư viện trình kết xuất webGl 2d).
Giao diện đối tượng:
module Game.Core {
export interface IObject {}
export interface IManagedObject extends IObject{
getKeyInManager(key: string): string;
setKeyInManager(key: string): IObject;
}
}
Vấn đề của tôi là mã bên trong getKeyInManager
và setKeyInManager
sẽ không thay đổi và tôi muốn sử dụng lại nó, không sao chép nó, đây là cách triển khai:
export class ObjectThatShouldAlsoBeExtended{
private _keyInManager: string;
public getKeyInManager(key: string): string{
return this._keyInManager;
}
public setKeyInManager(key: string): DisplayObject{
this._keyInManager = key;
return this;
}
}
Những gì tôi muốn làm là tự động thêm, thông qua a Manager.add()
, khóa được sử dụng trong trình quản lý để tham chiếu đối tượng bên trong chính đối tượng trong thuộc tính của nó _keyInManager
.
Vì vậy, hãy lấy một ví dụ với một Texture. Đây là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);
}
}
}
Khi tôi thực hiện this.add()
, tôi muốn Game.Managers.Manager
add()
phương thức gọi một phương thức sẽ tồn tại trên đối tượng được trả về Game.Core.Texture.fromImage("/" + relativePath)
. Đối tượng này, trong trường hợp này sẽ là Texture
:
module Game.Core {
// I must extends PIXI.Texture, but I need to inject the methods in IManagedObject.
export class Texture extends PIXI.Texture {
}
}
Tôi biết đó IManagedObject
là một giao diện và không thể chứa việc triển khai, nhưng tôi không biết phải viết gì để đưa lớp ObjectThatShouldAlsoBeExtended
vào bên trong Texture
lớp của mình . Biết rằng quá trình tương tự sẽ được yêu cầu cho Sprite
, TilingSprite
, Layer
và nhiều hơn nữa.
Tôi cần một phản hồi / lời khuyên có kinh nghiệm của TypeScript ở đây, phải có khả năng làm điều đó, nhưng không thể mở rộng nhiều lần vì chỉ có một lần có thể vào thời điểm đó, tôi không tìm thấy giải pháp nào khác.