2014-10-27 14 views
5

Mam "klasę podstawową", która zawiera "funkcję" akceptującą parametr typu "Array of const", jak pokazano poniżej: -Delphi - Jak mogę przekazać parametr Generic do funkcji akceptującej parametr Array const?

type 
    TBaseClass = class(TObject) 
    public 
    procedure NotifyAll(const AParams: array of const); 
    end; 

procedure TBaseClass.NotifyAll(const AParams: array of const); 
begin 
    // do something 
end; 

mam inny "klasę generycznym, który pochodzi od„klasy bazowej”(zdefiniowanego powyżej)

type 
    TEventMulticaster<T> = class(TBaseClass) 
    public 
    procedure Notify(AUser: T); reintroduce; 
    end; 

procedure TEventMulticaster<T>.Notify(AUser: T); 
begin 
    inherited NotifyAll([AUser]); ERROR HERE 
end; 

Za każdym razem mogę skompilować ten kod daje błędzie:

Zły typ argumentu w konstruktorze tablic o zmiennych typach

Co to znaczy być błędnym?

Odpowiedz

3

Nie można przekazać ogólnego argumentu jako variant open array parameter. Obsługa generycznych języków po prostu tego nie zaspokaja.

Co można zrobić, to opakować ogólny argument w typie wariantu. Na przykład TValue. Teraz nie można przekazać instancji TValue jako parametrów wariantowej otwartej tablicy, ale można zmienić NotifyAll, aby zaakceptować otwartą tablicę z TValue.

procedure NotifyAll(const AParams: array of TValue); 

Gdy masz to na miejscu można nazwać to z metody rodzajowe tak:

NotifyAll([TValue.From<T>(AUser)]); 

Zasadniczo to, co próbują zrobić tutaj jest łączenie kompilacji parametru zmienność czasową (rodzajów) z biegu wariancja parametru czasu. Dla tych ostatnich istnieją różne opcje. Parametry open array w wariancie są jedną z takich opcji, ale nie grają dobrze z rodzajami. Proponowana przeze mnie alternatywa, TValue, ma dobre współdziałanie z rodzajami.

+0

"NotifyAll (const AParams: array of TValue)" może zostać zadeklarowane jako 'overload', aby obsłużyć obie koncepcje również w klasie bazowej. –

Powiązane problemy