我可以通過聲明聲明一個類的類型:我可以傳遞一個泛型變量的類型作爲參數嗎?
type
TMyObject = class(TSomething);
TMyObjectClass = class of TMyObject;
我試圖做這樣的事情:
IData<TIn,TOut> = interface;
IData = interface
function GetGenericData<Tin,TOut>: IData<TInput,TOut>;
function GetInType: TRttiType;
function GetOutType: TRttiType;
end;
聲明一個基本類型,可以給訪問泛型類型和給我通用輸入和輸出類型的信息。
IData<TIn,TOut> = interface(IData)
['{5B402458-22EC-4A8B-83F3-C11AC575B79E}']
function GetInput(Index: Integer): TIn;
function GetInputCount: Integer;
function GetOutput(Index: Integer): TOut;
function GetOutputCount: Integer;
property Input[index: integer]: TIn read GetInput;
property Output[index: integer]: TOut read GetOutput;
property InputCount: integer read GetInputCount;
property OutputCount: integer read GetOutputCount;
end;
這裏是實際的泛型類型,它包含2個數據數組。請注意,輸入和輸出不需要是相同的類型。
然後我有一個類包含一個或多個不同類型的IData
。
TStage = class(TPipelineStage, IData);
TStage<TIn, TOut> = class(TStage, IData<TIn, TOut>);
TMyPipeline = class
fStages = TArray<TStage>; <<-- this is really a list of TStage<?,?>
我想在我的班級中列出不同的TStages,但顯然我無法對其編碼。
如何從fStages
訪問TStage<IInterfaceA, InterfaceB>
和TStage<InterfaceB, InterfaceB>
?
我可以在此上下文中使用class of ....
並從那裏實例化一個對象嗎?
我使用這種方法的原因是,我使用的管道階段的委託是這樣宣稱:
TDelegate<TIn, TOut> = reference to procedure(const Data: IData<TIn, TOut>);
'類的'站在類繼承之上。如果您想要混合使用數值類型和界面,則所有投注都將關閉。我甚至無法完全理解你想要做什麼。 –
正如大衛所說,目前還不清楚你在努力達到什麼目的。從我在這裏可以看到你的代碼,也許你是在思考這個問題,並試圖拋出一切(泛型,接口和常規類)來試圖解決它?它看起來像你想要實現的可以使用常規類來完成,而不需要將接口和泛型添加到混合中,通過用自定義對象列表替換接口並讓多態處理其餘部分。你提到使用'Class Of'和對象實例化標誌着Factory模式的潛在用途。 –