![]() |
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:
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...
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); } } |
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:
Man kann Typenparameter darauf einschränken, dass sie Klassen oder Structs sein müssen. Oder dass sie von einem bestimmten Typen ableiten.
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; } } Außerdem gibt es die Constraint "new()", was heißt, dass dein T einen öffentlichen Konstruktor ohne Parameter haben muss. |
AW: Metaklassen in Delphi, wie geht das mit C# [generics]?
In Delphi kann man, in der Deklaration
Delphi-Quellcode:
sagen, so daß nur noch Klassen übergeben werden können (keine Records oder andere einfache Typen).
<t: class>
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:
beschränken und dann im Konstruktor mit den genauen Typ prüfen.
class
'ne RedBox wäre manchmal ganz praktisch |
Alle Zeitangaben in WEZ +1. Es ist jetzt 00:03 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz