![]() |
Re: Warum TStrings erstellen mit TStringList.Create?
Zitat:
|
Re: Warum TStrings erstellen mit TStringList.Create?
Code:
In X passen also nur Menschen, Männer und Frauen rein
Lebewesen > Mensch > Mann > Frank
> Daniel > Frau > Hund > Pudel > Dackel var X: Mensch; Y: Lebewesen; Procedure Toilette(Tür: Mann); und in Y dagegen auch noch die Tiere. Auf dieses Klo dürfen auch NUR die Männer und demnach geht sozusagen Folgendes:
Delphi-Quellcode:
bei dem
Toilette(Frank);
Delphi-Quellcode:
könnte es sich eventuell auch um eine Frau handeln und wer möchte denn, daß die uns was abguckt? :zwinker:
Toilette(Mensch);
|
Re: Warum TStrings erstellen mit TStringList.Create?
@himitsu: Interessant, dass du die "Frau" bei den "Menschen" eingeordnet hast!? *grins* :drunken:
Zitat:
Zitat:
Ein größerer Eimer (Nachfahre) kann das beinhalten, was ein kleinerer Eimer (Basisklasse) beinhaltet. Nichtsdestotrotz wieder zurück zum eigentlichen Thema, das immer noch nicht gelöst ist: Warum eine Variable als TStrings deklarieren, wenn mit TStringList instanziert wird? Guido. |
Re: Warum TStrings erstellen mit TStringList.Create?
Zitat:
|
Re: Warum TStrings erstellen mit TStringList.Create?
@himitsu: in deinem Beispiel wären "Frank" und "Daniel" aber Instanzen von TMann und nicht Ableitungen. Oder was bilden denn Daniel und Frank denn noch neues aus? Ein viertes Bein? Wenn es natürlich Mutanten sind, dann wären es Ableitungen.
|
Re: Warum TStrings erstellen mit TStringList.Create?
Zitat:
Falls ich jedoch blind bin und eine Antwort schlichtweg übersehe, oder du sie erkennen kannst, dann bitte sag sie mir. Und um Missverständnissen vorzubeugen: Bitte nicht in Form von ![]() Guido. |
Re: Warum TStrings erstellen mit TStringList.Create?
TStrings ist eine abstrakte Klasse, hierin wird ein (Soll-)Verhalten festgelegt
TStringList ist eine Klasse, die das vorgegebene Verhalten implementiert. Es gibt aber auch andere Implementierungen (ein Beispiel hat Frank schon genannt) 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) |
Re: Warum TStrings erstellen mit TStringList.Create?
@Muetze1:
Delphi-Quellcode:
TLebewesen = class
Körper: TFettpolstermitknochen; ... end; TMann = class(TLebewesen) Eier: TSchrumpeldinger; Penis: TGlied; ... end; TFrau = class(TLebewesen) Hirn: TSchuhtick; Mumu: TSagichnicht; ... end; TFrank = class(TMann) Persönlichkeit: TFranksPersönlichkeit; ... end; Zitat:
Zitat:
|
Re: Warum TStrings erstellen mit TStringList.Create?
Zitat:
Edit: Schreibfehler korrigiert. |
Re: Warum TStrings erstellen mit TStringList.Create?
Zitat:
Delphi-Quellcode:
und hier x nur als Tstringlist verwendet und niemals nicht
var x:TStringList;
begin x:=TStringlist.create; ... end; eine andere Klasse (abgeleitet von TStrings) in x verwendet, dann ist es völlig sinnlos TStrings zu nehmen und in der Hilfe auch unsauber erklärt. --> Hier wäre x besser als TStringlist deklariert. Wenn du nirgends Probleme (mit dem Compiler) damit bekommst ist es auch in Ordnung TStringList zu verwenden. Mit TStrings würdest du dir Möglichkeiten verbauen, die vorhanden sind, du aber auf Grund der Deklaration nicht weist wo (Die Möglichkeit der Sortierung hat TStrings IMHO noch nicht dabei etc. pp). Wo nimmt man nun TStrings? Möglichkeit 1 (Wurde schon mehrfach hier erwähnt ): -> Parameter Du hast eine Methode, welche als Parameter TStrings bekommt
Delphi-Quellcode:
Du kannst in dieser Methode verschiedene Ableitungen von TStrings bekommen und bspw. nur die Strings auslesen und - wie hier - anzeigen. Ob das jetzt eine TStringList ist oder Memostrings oder von einem Stringgrid oder eine eigene Ableitung von TStrings ist völlig egal. Durch die virtualisierung des Getters von Strings wird bei jeder Variante intern eine andere Methode aufgerufen, nur du bekommst immer einen String vom Index 0 zurück.
procedure myClass.myMethod(x:TStrings)
begin showmessage(x.Strings[0]); end; 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):
Delphi-Quellcode:
Hier mal noch ein Beipsiel:
var x:TStrings;
begin if irgendetwas=irgendetwasanders then x:=TStringlist.create else x:=Memo1.lines; end; ... end;
Delphi-Quellcode:
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ExtCtrls; type TmyStrings = class(TStrings) protected function Get(Index: Integer): string; override; function GetCount: Integer; override; public function Add(const S: string): Integer; override; procedure Delete(Index: Integer); override; procedure Insert(Index: Integer; const S: string); override; procedure Clear; override; end; TForm1 = class(TForm) Memo1: TMemo; RadioGroup1: TRadioGroup; //mit 3 Einträgen Edit1: TEdit; Button1: TButton; //eintragen des Edits in ausgewählte Impl. von TStrings Button2: TButton; //Anzeige der Stringlist procedure RadioGroup1Click(Sender: TObject); procedure Button1Click(Sender: TObject); procedure Button2Click(Sender: TObject); procedure FormCreate(Sender: TObject); private { Private-Deklarationen } FStrings:TStrings; FmyStrings:TmyStrings; FStringList:TStringList; public { Public-Deklarationen } end; var Form1: TForm1; implementation {$R *.dfm} procedure TForm1.RadioGroup1Click(Sender: TObject); begin //Übergabe einer konkreten Implementierung an FStrings case RadioGroup1.ItemIndex of 0: FStrings:=Memo1.lines; 1: FStrings:=FmyStrings; 2: FStrings:=FStringList; else FStrings:=nil; end; end; procedure TForm1.Button1Click(Sender: TObject); begin //eigentliche Verwendeung von FStrings if assigned(FStrings) then FStrings.Add(edit1.Text); end; procedure TForm1.Button2Click(Sender: TObject); begin //Anzeige der StringList showmessage(FStringlist.Text); end; procedure TForm1.FormCreate(Sender: TObject); begin //ein paar Initialisierungen FStringList:=TStringlist.Create; FmyStrings:=TmyStrings.Create; end; { TmyStrings } function TmyStrings.Add(const S: string): Integer; begin //es wird in dem Programm ausschließlich add verwendet showmessage(s); result:=-1; end; procedure TmyStrings.Delete(Index: Integer); begin //abstrakte Methode überschreiben end; function TmyStrings.Get(Index: Integer): string; begin //abstrakte Methode überschreiben raise Exception.create('Keine Strings gespeichert'); end; function TmyStrings.GetCount: Integer; begin //abstrakte Methode überschreiben result:=0; end; procedure TmyStrings.Insert(Index: Integer; const S: string); begin //abstrakte Methode überschreiben end; procedure TmyStrings.Clear; begin //abstrakte Methode überschreiben end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 20:13 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