我有一個泛型類型,它將成爲事件系統中事件的基類。我們期望這些是單例,但它也是通用的,這樣子類可以在事件觸發時指定它們在回調中期望的參數的類型。在泛型Typescript類中實現單例
我有什麼看起來像這樣:
export interface IEvent { }
export interfact IEventArg { }
export abstract class Event<TEvent extends IEvent, TEventArg extends IEventArg> implements IMessageHandler {
private static s_instance : any;
private static s_isInitializing : boolean;
constructor() {
if (!Event.s_isInitializing)
throw new Error ("Use the GetInstance method to get this class instance.");
}
public static GetInstance<TEvent extends IEvent, TEventArg extends IEventArg>(type: { new() : T; }) : TEvent {
if (!s_instance) {
s_isInitializing = true;
s_instance = new type();
s_isInitializing = false;
}
return s_instance;
}
}
export class SelectionEvent extends Event<SelectionEvent, EmptyEventArg> {
...
}
var event = SelectionEvent.GetInstance(SelectionEvent);
有在這裏有些東西我覺得奇怪,並沒有大多是因爲打字稿語言要求。 GetInstance的參數似乎是必需的,因爲var x = new TEvent()
似乎不被TypeScript允許。空接口有助於實施可被接受爲通用類型的內容。
這裏似乎沒有工作的是靜態變量和泛型類型的組合。 GetInstance方法中的塊是我想要做的,但顯然它不能編譯。我還擔心靜態實例變量不會爲每個事件創建一次,而只是每個事件實例創建一次,並因此被覆蓋。
任何指導在這裏將不勝感激。
好吧,這就是我所關心的。我想我可能有一個替代實現的想法,會嘗試,並可能發佈一個單獨的問題。謝謝! –
對於具有不同名稱和類型參數的派生類(通用單例的)是否也適用?我會假設這是作爲獨立的類來處理派生的。因此,當有一個通用版本時,每次需要一個獨立的單例時,需要創建一個空的派生類,但可以重用通用單例代碼。並不是說只有好奇才能做到這一點。 – ntziolis