![]() |
Delphi-Version: 2010
Generische Klasse vs. generische Methode
Hallo,
und schon wieder gibts ein Problem mit Generics. Ich hatte mir eine Klasse erstellt, die so ziemlich alles mit Arrays anstellen kann, was ich brauche. Diese Klasse habe ich nur mit statischen Klassen-Methoden gefüllt, wobei die Klasse selbst dann generisch war. Hier ein vereinfachter Code:
Delphi-Quellcode:
Ich habe im Quelltext die Zeile markiert und mit einem Kommentar versehen, in der der Compiler einen Fehler meldet. Meine Frage ist, warum geht das denn bitte nicht? Es ist doch an sich nichts anderes, oder habe ich da was nicht verstanden.
type
TStaticClassA = class public function GenericLow<T>(const A: TArray<T>): Integer; end; TStaticClassB<T> = class public function GenericLow(const A: TArray<T>): Integer; end; // ============================= { TStaticClassA } function TStaticClassA.GenericLow<T>(const A: TArray<T>): Integer; begin Result := Low(A); end; { TStaticClassB<T> } function TStaticClassB<T>.GenericLow(const A: TArray<T>): Integer; begin Result := Low(A); // <- [DCC Fehler] Unit1.pas(45): E2008 Inkompatible Typen end; |
AW: Generische Klasse vs. generische Methode
Der Compiler weiß an dieser Stelle noch nicht, daß es sich um ein Array handelt und demnach geht sowas nicht.
Delphi-Quellcode:
TStaticClass = class
public function GenericLow<AType>(const A: array of AType): Integer; end; TGenericClass<AType> = class private type TArrayA = array of AType; public function Low(const A: TArrayA): Integer; //oder als open-array function Low(const A: array of AType): Integer; end; |
AW: Generische Klasse vs. generische Methode
Aber warum sollte der Compiler das noch nicht wissen?
|
AW: Generische Klasse vs. generische Methode
Wie sollte er beim Parsen von "T" darauf kommen, daß du dafür später mal ein Array übergibst?
|
AW: Generische Klasse vs. generische Methode
Es steht doch dran, dass es ein Array vom Typ T ist (TArray<T>). Oder stehe ich gerade auf dem Schlauch!? :gruebel:
|
AW: Generische Klasse vs. generische Methode
Oh, TArray<T> kennt Delphi ja wirklich :shock: ... ja dann ... hmmm ... vielleicht immernoch ein paar Kinderkrankheiten.
|
AW: Generische Klasse vs. generische Methode
Naja. Delphi kennt vllt. TArray<> aber das ändert nichts daran, dass TArray eine Klasse ist die ein Array kapselt und kein Array. Von daher klappt Low auch nicht. Du übergibst ja ein Objekt und kein Array :arrow: Inkompatible Typen
|
AW: Generische Klasse vs. generische Methode
Klasse?
Delphi-Quellcode:
Kann aber gut sein, daß die Generics den Array-Typen "verstecken"
TArray<T> = array of T;
|
AW: Generische Klasse vs. generische Methode
Mh.. Oh.
Nagut. Dann kann ich es mir auch nicht erklären :| |
AW: Generische Klasse vs. generische Methode
Genau das ist ja auch das Problem, welches ich habe. Es wirkt irgendwie sehr strange. Ich wüsste auch nicht, wie man sowas sinnvoll umschiffen könnte. Aber eigentlich fängtTArray<T> doch immer bei 0 an, da es ein dynamisches Array ist, oder?
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 14:32 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