AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Tutorials Container-Klassen in Delphi
Tutorial durchsuchen
Ansicht
Themen-Optionen

Container-Klassen in Delphi

Ein Tutorial von Luckie · begonnen am 22. Nov 2007 · letzter Beitrag vom 4. Dez 2007
Antwort Antwort
Seite 2 von 2     12   
OregonGhost

Registriert seit: 8. Jun 2002
Ort: Lübeck
1.216 Beiträge
 
Delphi 3 Professional
 
#1

Re: Container-Klassen in Delphi

  Alt 3. Dez 2007, 10:39
Du benötigst auch beim Rückgabewert keinen vollqualifizierten Typnamen, wenn der entsprechende Namespace oder Typ importiert wurde, was wohl der Fall ist, wenn du List<T> ohne Namespace-Angabe verwendest.
Oregon Ghost
---
Wenn NULL besonders groß ist, ist es fast schon wie ein bisschen eins.
  Mit Zitat antworten Zitat
Elvis

Registriert seit: 25. Nov 2005
Ort: München
1.909 Beiträge
 
Delphi 2010 Professional
 
#2

Re: Container-Klassen in Delphi

  Alt 3. Dez 2007, 10:39
Zitat von Luckie:
Zitat von Khabarakh:
ebenso die Namespace-Angabe von IEnumerator<T>, die eher verwirren dürfte und die du bei List<T> ja auch nicht verwendet hast.
Aber die brauche ich doch für das foreach Konstrukt:
Dafür solltest du IEnumerable<T> implementieren.
Denn so wie du es jetzt hast, hast du nur eine öffentliche Methode GetEnumerator und vertraust darauf, dass der Compiler anhand dieses Namens und des Rückgabewertes entscheidungen trifft. Aber ohne IEnumerable<T> gibt es kein LINQ und viele andere Dinge gehen auch nicht.
Eine Containerklasse sollte in .net alle Standardinterfaces implementieren, die auf sie zutreffen.
Bei dir wäre das IList<T>, welches ICollection<T> und IEnumerable<T> mitbringt.
Robert Giesecke
I’m a great believer in “Occam’s Razor,” the principle which says:
“If you say something complicated, I’ll slit your throat.”
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#3

Re: Container-Klassen in Delphi

  Alt 3. Dez 2007, 10:49
Zitat von Elvis:
Dafür solltest du IEnumerable<T> implementieren.
Denn so wie du es jetzt hast, hast du nur eine öffentliche Methode GetEnumerator und vertraust darauf, dass der Compiler anhand dieses Namens und des Rückgabewertes entscheidungen trifft. Aber ohne IEnumerable<T> gibt es kein LINQ und viele andere Dinge gehen auch nicht.
Eine Containerklasse sollte in .net alle Standardinterfaces implementieren, die auf sie zutreffen.
Bei dir wäre das IList<T>, welches ICollection<T> und IEnumerable<T> mitbringt.
Da stehe ich jetzt ehrlich gesagt etwas auf dem Schlauch.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Elvis

Registriert seit: 25. Nov 2005
Ort: München
1.909 Beiträge
 
Delphi 2010 Professional
 
#4

Re: Container-Klassen in Delphi

  Alt 3. Dez 2007, 11:06
Zitat von Luckie:
Da stehe ich jetzt ehrlich gesagt etwas auf dem Schlauch.
IEnumerable ist das Basisinterface für alles worüber man einen for-each machen kann.
Also für alle Datencontainer.
IEnumerable<T> ist eine Spezialisierung für einen bestimmten Itemtypen.
"LINQ over Objects" basiert auf IEnumerable<T>, genau wie viele Methoden von vielen Hunderten von Klassen mit IEnumerable<T> umgehen können.
Es nicht zu implemetnieren würde heißen, dass deine Containerklasse nur so wie in Delphi wäre: Eine weitere Klasse. Mit der Implementierung ist sie eine richtige Containerklasse, auf die du Abfragen machen kannst, die du mit einem Call an eine andere Liste anhängen kannst,...

Mit meinem Beispiel oben wäre folgende LINQ-Query möglich:
Delphi-Quellcode:
var persons := new PersonList<Person>();
// irgendws hinzufügen

var personNames :=
  (from p in persons
   where not String.IsNullOrEmpty(p.Name)
   select distinct p.Name).ToList();
Robert Giesecke
I’m a great believer in “Occam’s Razor,” the principle which says:
“If you say something complicated, I’ll slit your throat.”
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#5

Re: Container-Klassen in Delphi

  Alt 3. Dez 2007, 13:26
Ich habe jetzt eine aktualisierte Fassung im ersten Posting hochgeladen. Die Modifikationen der Klasse, wie sie Elvis vorschlägt sind noch nicht eingearbeitet.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Benutzerbild von xZise
xZise

Registriert seit: 3. Mär 2006
Ort: Waldbronn
4.303 Beiträge
 
Delphi 2009 Professional
 
#6

Re: Container-Klassen in Delphi

  Alt 3. Dez 2007, 15:09
Zitat von Khabarakh:
Zitat von xZise:
Warum nicht von TList erben, und dann die Add... Methoden mit neuen Parametern überschreiben?
Wie willst du eine statische Methode überschreiben, noch dazu mit anderen Parametern ? Und wenn du Add nur verdeckst/überlädst, hast du am Ende alles Mögliche, aber auf keinen Fall eine typsichere Liste.
*pfeif*

Ich sehe gerade, Luckie, dass du fast genauso wie ich es vorgeschlagen habe, hast du es umgesetzt.

MfG
xZise
Fabian
Eigentlich hat MS Windows ab Vista den Hang zur Selbstzerstörung abgewöhnt – mkinzler
  Mit Zitat antworten Zitat
mashutu

Registriert seit: 15. Nov 2007
195 Beiträge
 
#7

Re: Container-Klassen in Delphi

  Alt 4. Dez 2007, 11:32
Sorry wenn das jetzt hier leicht OT wird,
aber ich bin soeben ueber den Konstrukt
Delphi-Quellcode:
type
  PersonList<T> = public class(IList<T>)
    where T is Person, T has constructor;
[...]
gestolpert.
Ich arbeite zwar seit mehr als 20 Jahren mit Pascal, aber diese Syntax ist mir neu und latuernich moechte ich wissen, was das ist und wie man es verwenden kann. Falls jemand einen Link zu einem Tutorial hat, waere ich dankbar.
utu

if it was hard to write it should be hard to read
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#8

Re: Container-Klassen in Delphi

  Alt 4. Dez 2007, 11:38
Das ist ja auch kein Pascal, sondern C#.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Benutzerbild von Khabarakh
Khabarakh

Registriert seit: 18. Aug 2004
Ort: Brackenheim VS08 Pro
2.876 Beiträge
 
#9

Re: Container-Klassen in Delphi

  Alt 4. Dez 2007, 12:49
Nope, das ist Roberts Chrome-Schnipsel .

@mashutu: Chrome ist ein Pascal-Dialekt für .Net. Was du dort siehst, ist ein .Net-Feature namens Generics, die vor allem von Java bekannt sind. Auch FreePascal, C++, Ada, ... bieten so etwas (Ähnliches).
Kurz umrissen kannst du beim Benutzen der Klasse den Typparameter T durch einen beliebigen Typ ersetzen (wobei da noch die Constraints eine Rolle spielen, die du mitgequotet hast: T muss von Person abgeleitet sein und einen öffentlichen, parameterlosen Konstruktor haben).
Delphi-Quellcode:
var
  list : PersonList<Customer>; // T = Customer (eine von Person abgeleitete Klasse)
begin
  [...]
  list[0].Orders[...]; // Person besitzt keine Eigenschaft Orders, dennoch müssen wir nicht casten, da Item[] ja nicht Person sondern T zurückgibt. Und in unserem Fall ist T = Customer
end;
Sebastian
Moderator in der EE
  Mit Zitat antworten Zitat
mashutu

Registriert seit: 15. Nov 2007
195 Beiträge
 
#10

Re: Container-Klassen in Delphi

  Alt 4. Dez 2007, 14:49
Danke an Lucky und Khabarakh fuer die kurze Info und den Link zu Chrome
utu

if it was hard to write it should be hard to read
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 2     12   


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 16:15 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