Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   .NET-Framework (managed code) (https://www.delphipraxis.net/79-net-framework-managed-code/)
-   -   Metaklassen in Delphi, wie geht das mit C# [generics]? (https://www.delphipraxis.net/162580-metaklassen-delphi-wie-geht-das-mit-c-%5Bgenerics%5D.html)

Iwo Asnet 30. Aug 2011 09:38

Metaklassen in Delphi, wie geht das mit C# [generics]?
 
Delphi-Quellcode:
Type
  TMyListElementClass = Class Of TMyListElement; <<<

Procedure Foobar;
Var
  myList : TList;
  myElementClass : TMyListElementClass;

  myElement : TMyListelement;

Begin
  myList := TList.Create;
  myElementClass := TSomeDerivateOfTMyListElement;

  myElement := myElementClass.Create;
  myElement.SomeMethodFromTMyListElement;
  myList.Add (myElement);
End;
Code:
Class TMyList<T>
{
  public List<T>Items = new List<T>();

  public void AddOneElement()
  {
    T item = Activator.CreateInstance<T>();
   (item as TMyListElement).SomeMethodFromTMyListElement; // Das behagt mir nicht
    Items.Add(item);
  }
}
Frage: Kann ich dafür sorgen, das der Metaklassentyp 'T' mindestens vom GrundTyp 'TMyListElement' ist? Am Besten wäre es, wenn der Compiler schon meckert, aber von mir aus auch der Konstruktor zur Laufzeit...

Elvis 30. Aug 2011 09:51

AW: Metaklassen in Delphi, wie geht das mit C# [generics]?
 
Metaclasses sind ja eigentlich nix weiter als Factories, die außerdem alle Class-Member als Instance-Member haben.

C#'s Philosophie ist ja alles so einfach wie möglich zu machen. Und Features, die sich genauso gut durch Libraries lösen lassen, werden nicht in die Sprache aufgenommen.

Für dein konkretes Beispiel gibt es allerdings eine Syntax:
Code:
public class MyList<T>
  where T: new(), MyListElement
{
  ...
  public T AddOneElement()
  {
    var item = new T();
    item.SomeMethodFromTMyListElement(); // Das behagt mir nicht
    Items.Add(item);
    return item;
  }
}
Man kann Typenparameter darauf einschränken, dass sie Klassen oder Structs sein müssen. Oder dass sie von einem bestimmten Typen ableiten.
Außerdem gibt es die Constraint "new()", was heißt, dass dein T einen öffentlichen Konstruktor ohne Parameter haben muss.

himitsu 30. Aug 2011 09:52

AW: Metaklassen in Delphi, wie geht das mit C# [generics]?
 
In Delphi kann man, in der Deklaration
Delphi-Quellcode:
<t: class>
sagen, so daß nur noch Klassen übergeben werden können (keine Records oder andere einfache Typen).
Direkt auf eine bestimmte Klasse zu begrenzen geht leider nicht. :cry:

Ich vermute mal, daß wird in C# ähnlich sin.


Wenn dem so ist, dann in der Deklaration auf
Delphi-Quellcode:
class
beschränken und dann im Konstruktor mit den genauen Typ prüfen.


'ne RedBox wäre manchmal ganz praktisch


Alle Zeitangaben in WEZ +1. Es ist jetzt 17:44 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