Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   Delphi Generics T:=NIL Problem? (https://www.delphipraxis.net/182808-generics-t-%3Dnil-problem.html)

Mavarik 19. Nov 2014 15:08

Generics T:=NIL Problem?
 
Hallo Zusammen!

Ich wollte eine TThreadlist erweiter, da ich das herausholen eines Items etwas unhandlich finden.

Schön wäre gewesen:

Delphi-Quellcode:
var
  Que : TThreadList<IFoo>;
  Foo : IFoo;
begin
  Foo := Que.Locklist.First; // Schade
  try
    Foo.Whatever;
  finally
    Que.Unlocklist;
  end;
end;
Leider liefert das eine Exception, wenn die Liste leer ist, da ITEM[0] zugegriffen wird.

Also eine kleine Ableitung

Delphi-Quellcode:
type
    TMyThreadQue<T>   = class(TThreadList<T>)
      Public
        Function PopElement(Var LCommand:T):boolean;
    end;

function TMyThreadQue<T>.PopElement(var LCommand: T): boolean;
var
  CList : TList<T>;
begin
  CList := LockList;
  try
    if CList.Count > 0
      then begin
             Result := true;
             LCommand := CList.First;
             CList.Remove(LCommand);
           end
      else begin
             Result := false;
             LCommand := NIL; // Wie geht das hier?
           end;
  finally
    UnlockList;
  end;
end;
Frage: Wie kann ein "T" initialisieren?
Oder habe ich da einen Denkfehler?

Grüsse Mavarik

Neutral General 19. Nov 2014 15:12

AW: Generics T:=NIL Problem?
 
Wenn alle deine möglichen T's auf Objekte beschränkt sind dann indem du

Delphi-Quellcode:
TMyThreadQue<T : class> = class(TThreadList<T>)
definierst.

Daniel 19. Nov 2014 15:20

AW: Generics T:=NIL Problem?
 
Stichwort "Constraints". Alternativ:
Delphi-Quellcode:
LCommand := Default( T );

BUG 19. Nov 2014 15:23

AW: Generics T:=NIL Problem?
 
In Java löst man solche Probleme meist mit einer Factory, in C++ funktioniert da mit Templates problemlos :stupid:

Allgemein ließe sich das umgehen, indem du
Delphi-Quellcode:
LCommand := NIL; // Wie geht das hier?
weglässt und den Parameter mit dem Defaultwert initialisierst oder einfach den Rückgabewert zuerst auswertest:
Delphi-Quellcode:
var
  Que : TThreadList<IFoo>;
  Foo : IFoo;
begin
  //Foo := nil;
  if Que.popElement(Foo) then
  begin
    try
      Foo.Whatever;
    finally
      Que.Unlocklist;
    end;
  end;
end;

Mavarik 19. Nov 2014 15:24

AW: Generics T:=NIL Problem?
 
Zitat:

Zitat von Daniel (Beitrag 1280357)
Stichwort "Constraints". Alternativ:
Delphi-Quellcode:
LCommand := Default( T );

Cool...
Ich gehe davon aus, dass ein Default(Foo) = NIL ist? // Also Default(IInterface) = NIL

Mavarik


Alle Zeitangaben in WEZ +1. Es ist jetzt 10:04 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz