मैं अपना समय बचाना चाहता हूं और PIXI कक्षाओं (एक 2d webGl रेंडरर लाइब्रेरी) तक फैली कक्षाओं में आम कोड का पुन: उपयोग करना चाहता हूं।
ऑब्जेक्ट इंटरफेस:
module Game.Core {
export interface IObject {}
export interface IManagedObject extends IObject{
getKeyInManager(key: string): string;
setKeyInManager(key: string): IObject;
}
}
मेरा मुद्दा यह है कि कोड अंदर है getKeyInManager
और setKeyInManager
नहीं बदलेगा और मैं इसका पुन: उपयोग करना चाहता हूं, इसे डुप्लिकेट नहीं करना है, यहां कार्यान्वयन है:
export class ObjectThatShouldAlsoBeExtended{
private _keyInManager: string;
public getKeyInManager(key: string): string{
return this._keyInManager;
}
public setKeyInManager(key: string): DisplayObject{
this._keyInManager = key;
return this;
}
}
मैं जो करना चाहता हूं वह स्वचालित रूप से जोड़ना है, एक के माध्यम से Manager.add()
, प्रबंधक का उपयोग वस्तु के अंदर वस्तु को अपनी संपत्ति में संदर्भित करने के लिए किया जाता है _keyInManager
।
तो, चलो एक बनावट के साथ एक उदाहरण लेते हैं। यहाँ जाता है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);
}
}
}
जब मैं करता हूं this.add()
, तो मुझे उस Game.Managers.Manager
add()
विधि को कॉल करने की विधि चाहिए जो उस वस्तु पर मौजूद होगी जो उसके द्वारा लौटा दी गई है Game.Core.Texture.fromImage("/" + relativePath)
। यह वस्तु, इस मामले में Texture
:
module Game.Core {
// I must extends PIXI.Texture, but I need to inject the methods in IManagedObject.
export class Texture extends PIXI.Texture {
}
}
मुझे पता है कि IManagedObject
एक इंटरफ़ेस है और इसमें कार्यान्वयन नहीं हो सकता है, लेकिन मुझे नहीं पता कि ObjectThatShouldAlsoBeExtended
मेरी Texture
कक्षा के अंदर कक्षा को इंजेक्ट करने के लिए क्या लिखना है । यह जानते हुए कि एक ही प्रक्रिया के लिए आवश्यक होगा Sprite
, TilingSprite
, Layer
और अधिक।
मुझे यहां एक अनुभवी टाइपस्क्रिप्ट फीडबैक / सलाह की आवश्यकता है, इसे करना संभव है, लेकिन एक से अधिक विस्तार से नहीं, क्योंकि उस समय केवल एक ही संभव है, मुझे कोई अन्य समाधान नहीं मिला।