Rozważmy następujący przykład (używam Delphi XE):Delphi XE: Konstruktor klasy nie zostanie wywołana w klasie przy użyciu rodzajowych
program Test;
{$APPTYPE CONSOLE}
type
TTestClass<T> = class
private
class constructor CreateClass();
public
constructor Create();
end;
class constructor TTestClass<T>.CreateClass();
begin
// class constructor is not called. this line never gets executed!
Writeln('class created');
end;
constructor TTestClass<T>.Create();
begin
// this line, of course, is printed
Writeln('instance created');
end;
var
test: TTestClass<Integer>;
begin
test := TTestClass<Integer>.Create();
test.Free();
end.
Klasa constructur nigdy nie nazywa, a więc linia „klasa utworzona "nie jest drukowane. Jeśli jednak usuwam uogólnienie i zmienię TTestClass<T>
na standardową klasę TTestClass
, wszystko działa zgodnie z oczekiwaniami.
Czy brakuje mi czegoś z lekami generycznymi? Lub po prostu nie działa?
Wszelkie przemyślenia na ten temat zostaną zatrzymane!
Dzięki, --Stefan--
[Dokumentacja] (http://docwiki.embarcadero.com/RADStudio/en/Methods#Class_Constructors) stwierdza: "Uwaga: Konstruktor klasy dla ogólnej klasy lub rekordu może być wykonywany wiele razy. Konstruktor klasy jest wykonywany w tym przypadku w zależności od liczby wyspecjalizowanych wersji typu ogólnego, na przykład konstruktor klasy specjalistycznej TList może wykonywać wiele razy w tej samej aplikacji. " Ale wygląda trochę jak błąd. –
Tak. Ja też to czytam. Chyba że "wiele razy" zawiera zero razy, to naprawdę wygląda jak błąd. – Schafsmann
Ogólna zasada: Nie próbuj tworzyć samodzielnej aplikacji .dpr. Zawsze dysponuj co najmniej jedną jednostką i trzymaj wszystko z plików DPR, których możesz uniknąć. –