Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   Delphi Abgeleitete generische Klasse ist nicht mehr generisch (https://www.delphipraxis.net/198111-abgeleitete-generische-klasse-ist-nicht-mehr-generisch.html)

Codehunter 4. Okt 2018 12:13

Abgeleitete generische Klasse ist nicht mehr generisch
 
Hallo!

Dieser Lösung hier folgend habe ich eine identische Implementierung vorgenommen:
Delphi-Quellcode:
type
  TmyArray = class(System.Generics.Collections.TArray)
  public
    class function Contains<T>(const Values: array of T; const Item: T; const Comparer: IEqualityComparer<T>; out ItemIndex: Integer): Boolean; overload; static;
    class function Contains<T>(const Values: array of T; const Item: T; out ItemIndex: Integer): Boolean; overload; static;
    class function Contains<T>(const Values: array of T; const Item: T): Boolean; overload; static;
    class function IndexOf<T>(const Values: array of T; const Item: T; const Comparer: IEqualityComparer<T>): Integer; overload; static;
    class function IndexOf<T>(const Values: array of T; const Item: T): Integer; overload; static;
  end;
Doch wenn ich diesen Typ dann analog zu TArray<string> als TmyArray<string> verwenden will, meckert der Compiler:
Delphi-Quellcode:
procedure Produce;
var
  myArray: TmyArray<string>; // <-- E2003 Undeklarierter Bezeichner: 'TmyArray<>'
begin
  {...}
end;
Lasse ich das
Delphi-Quellcode:
<string>
in der Deklaration weg, kompiliert das zwar, kracht dann aber anschließend (logischerweise) in der Verwendung:
Delphi-Quellcode:
procedure Produce;
var
  myArray: TmyArray;
begin
  myArray := ['Foo', 'Bar', 'Baz']; // <-- E2001 Ordinaltyp erforderlich
end;
Und nu steh ich auf dem Schlauch. :-(

Grüße
Cody

Neutral General 4. Okt 2018 12:20

AW: Abgeleitete generische Klasse ist nicht mehr generisch
 
Edit: Was hier vorher stand war alles Unsinn.

Das TArray von Generics.Collections ist nur eine Klasse mit Helpermethoden für TArray<T> aus der System.pas.
Und TArray<T> ist keine Klasse, also kannst du nicht davon ableiten.
Was hast du denn vor? Wenn du einfach nur mehr Helper-Methoden willst, dann kannst du dein TmyArray so lassen, aber musst dann deine Variablen trotzdem als TArray<T> (z.B. TArray<String>) deklarieren.

Codehunter 4. Okt 2018 12:36

AW: Abgeleitete generische Klasse ist nicht mehr generisch
 
Zitat:

Zitat von Neutral General (Beitrag 1414861)
Was hast du denn vor? Wenn du einfach nur mehr Helper-Methoden willst, dann kannst du dein TmyArray so lassen, aber musst dann deine Variablen trotzdem als TArray<T> (z.B. TArray<String>) deklarieren.

Darauf läufts ja hinaus. Das Problem hier ist aber anscheinend, dass TmyArray sich in einer anderen Unit befindet. Wenn ich das jetzt so lasse, wie benutze ich dann meine Zusatzimplementierung "IndexOf"?

himitsu 4. Okt 2018 12:42

AW: Abgeleitete generische Klasse ist nicht mehr generisch
 
Als Class/Record-Helper könnte er seine Methoden aber dennoch dranhängen, selbst wenn Ableiten nicht geht.

Codehunter 4. Okt 2018 12:43

AW: Abgeleitete generische Klasse ist nicht mehr generisch
 
Ach, ich bin doch doof :roll: Hab ich doch glatt übersehen, dass das class functions sind. Typischer Fall von Wald und Bäumen ^^

Codehunter 5. Okt 2018 08:58

AW: Abgeleitete generische Klasse ist nicht mehr generisch
 
Jetzt bin ich in dem Zusammenhang auf ein weiteres Problem gestoßen:
Delphi-Quellcode:
const
  A_ITEMS: TArray<string> = ['A','B','C'];
begin
  case TmyArray.IndexOf(A_ITEMS, 'B') of // <-- E2532 Generisches Typargument konnte aus den unterschiedlichen Argumenttypen für Methode 'IndexOf' nicht abgeleitet werden
    0: ;
   1: ;
   2: ;
  end;
end;
Die Deklaration von TmyArray hat sich nicht geändert (siehe oben)

EDIT: Verwende ich statt eines konstanten Arrays eines, das als lokale Variable deklariert ist, dann geht es. Nur warum ist das so?

Neutral General 5. Okt 2018 09:11

AW: Abgeleitete generische Klasse ist nicht mehr generisch
 
Also was auf jeden Fall gehen sollte wäre halt:
Delphi-Quellcode:
case TmyArray.IndexOf<String>(A_ITEMS, 'B') of
Warum genau der Fehler kommt bzw. warum es mit einer lokalen Variable geht, kann ich so aus dem Stand auch nicht sagen.
Wahrscheinlich denkt er aus irgendeinem Grund, dass auch TmyArray.IndexOf<Char> zutreffen könnte? Aber so richtig sehe ich keinen Grund dafür :gruebel:

Codehunter 5. Okt 2018 09:40

AW: Abgeleitete generische Klasse ist nicht mehr generisch
 
Zitat:

Zitat von Neutral General (Beitrag 1414977)
Wahrscheinlich denkt er aus irgendeinem Grund, dass auch TmyArray.IndexOf<Char> zutreffen könnte? Aber so richtig sehe ich keinen Grund dafür :gruebel:

Das kann es nicht sein, denn in der praktischen Implementierung prüfe ich explizit gegen eine String-Variable und nicht gegen eine Char-Konstante. Außerdem dürfte es dann genausowenig funktionieren, wenn A_ITEMS eine Variable statt einer Konstante ist. Aber dann geht es ja. Die Ursache scheint also zu sein, dass es sich um eine Array-Konstante handelt.

Stevie 5. Okt 2018 10:03

AW: Abgeleitete generische Klasse ist nicht mehr generisch
 
Reported: https://quality.embarcadero.com/browse/RSP-21372

Codehunter 5. Okt 2018 10:16

AW: Abgeleitete generische Klasse ist nicht mehr generisch
 
Danke dir. Mal schauen was passiert. Bis auf Weiteres dann erstmal mit Variablen.


Alle Zeitangaben in WEZ +1. Es ist jetzt 06:09 Uhr.
Seite 1 von 2  1 2      

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