Einzelnen Beitrag anzeigen

Guido Eisenbeis

Registriert seit: 9. Apr 2006
389 Beiträge
 
Delphi 10.3 Rio
 
#25

Re: Warum TStrings erstellen mit TStringList.Create?

  Alt 3. Jan 2010, 17:53
Mann oh Mann, ganz schön viel Zeugs! Ich versuche das mal möglichst kurz zusammen zu fassen. (Wird wohl trozdem ein bisschen länger )

Zitat von sirius:
Wenn man direkt folgendes macht:
Delphi-Quellcode:
var x:TStringList;
begin
  x:=TStringlist.create;
 
  ...
end;
und hier x nur als Tstringlist verwendet und ..., dann ist es völlig sinnlos TStrings zu nehmen und in der Hilfe auch unsauber erklärt.
...
Mit TStrings würdest du dir Möglichkeiten verbauen, die vorhanden sind, ...
Nach allem was ich jetzt so durchblicke, ist das in der Hilfe schon dicht an einem Bug, oder? Denn wie sirius und weiter unten auch himitsu (ist das Frank?) schreiben, sind dann die Möglichkeiten von TStringList nicht mehr vorhanden! (Hab ich selbstverständlich getestet.)

Zitat von sirius:
Wo nimmt man nun TStrings?
Möglichkeit 1 (Wurde schon mehrfach hier erwähnt ):
-> Parameter
Du hast eine Methode, welche als Parameter TStrings bekommt
Ist klar, ist aber ein anderes Thema.

Zitat von sirius:
Möglichkeit 2
-> Unterschiedliche Instanzierung von TStrings
Du bist dir bei der Deklaration noch nicht sicher welche Variante du von TStrings nimmst (das entscheidet sich quasi erst zur Laufzeit)
Auch klar, auch ein anderes Thema. In diesem Thema geht es darum, dass TStringList gebraucht wird. Und die Deklaration in der Hilfe als TStrings deshalb auch als Bug anzusehen ist, denn man kann ja die Methoden und Eigenschaften von TStringList nicht nutzen (wie z. B. Sort).

Hier kristallisiert sich jetzt auch eine andere Formulierung der Ausgangsfrage herraus. Denn mit zunehmenden Informationen scheint es mir immer unsinniger, eine TString-Variable mit TStringList.Create zu instanzieren. In einem Beispiel von sirius verzweigt er zwar in einer Abfrage nach TStringlist.create,

Delphi-Quellcode:
var x:TStrings;
begin
  if irgendetwas=irgendetwasanders then
    x:=TStringlist.create // <-- hier
  else
    x:=Memo1.lines;
  end;
aber wirklich Sinn macht es doch nicht, da nur die Eigenschaften und Methoden von TStrings verwendet werden können. Es kann an der obigen Stelle doch mit was-weiß-ich-was instanziert werden, es bleibt doch immer nur TStrings verfügbar. Oder sehe ich das falsch?

Zitat von himitsu:
Wenn du selber die TempList nur als TStringList verwendest und sie nicht weitergibst, dann kannst du sie auch direkt als TStringList deklarieren ...
Soweit ich das jetzt verstanden und getestet habe, ist es egal, als was man "TempList" deklariert oder instanziert hat. Es ist bei Weitergeben nur wichtig, welchen Datentyp der Parameter der Weitergabe-Routine hat. Ist zum Beispiel in der Routine der Parameter mit TStringList deklariert, meine Variable vorher mit TStrings deklariert und mit TStringList.Create instanziert, wirft der Compiler Fehler, wegen inkompatiblen Typen.

Zitat von himitsu:
... kannst du sie auch direkt als TStringList deklarieren und hast dann auch direkten Zugriff auf spezielle Erweiterungen der TStringList.
Das finde ich einen wichtigen Punkt, der in der Hilfe fehlt! Denn wenn man nun das hier alles nicht weiß, in seinem Programm eine Variable mit TStrings deklariert und mit TStringList instanziert, wundert man sich vielleicht, warum dann z. B. Methoden von TStringList nicht verfügbar sind.

Zitat von mkinzler:
TStrings ist eine abstrakte Klasse, hierin wird ein (Soll-)Verhalten festgelegt
TStringList ist eine Klasse, die das vorgegebene Verhalten implementiert.
...
Wenn man den Typ einer Variablen nun auf TStrings festlegt, kann man hier Referenzen auf Objekte verschiedenster Ableitungen/Implementierungen ablegen; TStringList limitiert auf die eine Implementierungen ( und Nachfahren dieser)
Ist klar (und war es auch schon vorher, ... naja, vielleicht nicht so deutlich wie jetzt ). Das bestätigt doch das was ich von vornherein vermutet habe: Wenn man TStringList haben will, ist eine Deklaration mit TStrings falsch = Fehler in der Delphi-Hilfe.

Zitat von himitsu:
Wenn die Klasse als TStrings deklariert ist, hast du aber über die Variable nur direkten Zugriff auf die Anteile der TStrings-Schnittstelle.
Sortieren kann man dann also nicht mehr.
Bestätigt das ebenfalls.

Zitat von himitsu:
- Parameterdeklarationen so klein wie möglich, dann hast du die größte Kompatibilität zu anderen Ableitungen
> also TStrings
Dem stimme ich zu.

Zitat von himitsu:
- Variablendeklarationen so hoch wie möglich, denn dann hast du direkten Zugriff auf alle Möglichkeiten der instantitierten Klasse
> also TStringList
Das sehe ich genauso. Damit sehe ich die Ausgangsfrage als beantwortet an: Wenn man TStringList mit seinen Eigenschaften und Methoden haben will (und nach meiner Meinung ist das der Fall, wenn man mit TStringList.Create instanziert), dann ist es falsch mit TStrings zu deklarieren.

Puh, geschafft. Vielen Dank an alle für die Antworten! Falls ich das Resümee (schreibt man wirklich so) falsch erstellt habe, freue ich mich über Berichtigung. Falls es richtig ist (könnte fast eine if-Abfrage formulieren *smile*) freue ich mich über Bestätigung.

Guido.

PS: Ich hoffe, ich hab da nicht allzuviele Fehler drin, es war jetzt doch ziemlich viel aufzuarbeiten.
  Mit Zitat antworten Zitat