AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

OOP: Erzeugen von Objekten & Co.

Ein Thema von Jazzman_Marburg · begonnen am 21. Okt 2009 · letzter Beitrag vom 21. Okt 2009
Antwort Antwort
Benutzerbild von Jazzman_Marburg
Jazzman_Marburg

Registriert seit: 2. Aug 2004
359 Beiträge
 
#1

OOP: Erzeugen von Objekten & Co.

  Alt 21. Okt 2009, 18:56
Moin, Moin!

Ich versuche gerade ein Stück fremden Codes zu verstehen -- und verstehe partout folgendes Konstrukt nicht, und hoffe einfach mal, ein Sachkundiger kann hier helfen:

Wir haben folgende Klassendefinition:
TXYListe = CLASS(TStringlist).

D.h. alle Objekte dieser Klasse werden mit z.B:
MeineListe : TXYListe deklariert und anschließend mit
MeineListe := TXYListe.Create erzeugt.

Soweit ok. Aber nun taucht im Coding folgende Variable auf:
VerwendeteListen: TStringList;

Und diese Liste wird folgendermaßen erzeugt:
VerwendeteListen := TXYListe.Create;

Diese Art der Erzeugung verstehe ich nicht. Was enthält denn nun "VerwendeteListen"? Was macht den Unterschied zu "MeineListe" aus?

Ich hoffe ich konnte mich halbwegs verständlich machen.
Vielen Dank & Schönen Gruß

Jazzman
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.625 Beiträge
 
Delphi 12 Athens
 
#2

Re: OOP: Erzeugen von Objekten & Co.

  Alt 21. Okt 2009, 18:58
VerwendeteListen ist dann vom Typ TXYListe. Das ist deshalb problemlos möglich, weil TXYListe ja ein Abkömmling von TStringlist ist.
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Benutzerbild von Jazzman_Marburg
Jazzman_Marburg

Registriert seit: 2. Aug 2004
359 Beiträge
 
#3

Re: OOP: Erzeugen von Objekten & Co.

  Alt 21. Okt 2009, 19:40
Vielen Dank!

D.h. wenn ich Dich richtig verstehe, dass sich die beiden Listen:

TXYListe = CLASS(TStringlist).
...

VAR
MeineListe : TXYListe;
VerwendeteListen : TStringList;

...
MeineListe := TXYListe.Create;
VerwendeteListen := TXYListe.Create;

zum Zeitpunkt der Erzeugung nicht unterscheiden: Beides Objekte vom Typ TXYListe?

Eine Art "syntaktisches Rauschen" also -- was beim späterem Lesen des Codes nur das Verständnis nur erschwert?!

Vielen Dank, das hilft mir auf die Sprünge

Gruß
Jazzman
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.625 Beiträge
 
Delphi 12 Athens
 
#4

Re: OOP: Erzeugen von Objekten & Co.

  Alt 21. Okt 2009, 19:42
Die Variable ist als TStringlist deklariert und wird erst beim Instanzieren "spezialisiert", so einfach ist das
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Muetze1
(Gast)

n/a Beiträge
 
#5

Re: OOP: Erzeugen von Objekten & Co.

  Alt 21. Okt 2009, 19:54
Oder grob anders formuliert: Mit der Ableitung von TXYListe von TStringList kann TXYListe alles was TStringList kann und noch ein wenig mehr. Somit kannst du einer TStringList Variablen auch deren Nachfahren als Instanz zuweisen, da alle Nachfahren mindestens das können was auch TStringList kann. Alle Abkömmlinge bilden neue Eigenschaften und Methoden aus und sind damit höher spezialisiert.

Im Gegenzug kannst du aber einer TXYListe Variablen keine Instanz von TStringList zuweisen, da TStringList nicht alles kann, was TXYListe kann.

Das ganze soll aber nicht das Lesen erschweren, dazu dient dies nicht. Aber es ist nicht üblich für Objektdeklarationen immer die höchsten Integrationstiefe zu nutzen. Sprich: es ist unüblich die höchste Spezialisierung für die Variable zu deklarieren. Wenn man dies macht, schränkt man sich bei der Nutzung selbst recht stark ein auf den Typ und dessen Nachfahren. Es ist sogar schon unüblich TStringList zu nutzen in der Deklaration von Variablen sondern eher TStrings. Diese sind der Vorfahre von TStringList.

Beispiel:

Wenn du eine Methode hast welche mit einer TStringList arbeitet, d.h. sie geht z.B. die Liste durch und holt sich immer die einzelnen Strings heraus und verarbeitet diese. Wenn nun diese Methode als Parameter diese TStringList entgegen nimmt, dann kannst du dies mit TStringList deklarieren. Damit legst du dich schon auf TStringList und deren Nachfahren fest. Diese Methode ist dann z.B. nicht anwendbar auf z.B. TListBox.Items. Diese stellen eine andere Ableitung von TStrings dar. Im Endeffekt gibt es aber keinen Grund warum deine Methode sich einschränkt auf TStringList, da sie nichts epezielles nutzt. Würdest du den Parameter aber auf den Vorfahren TStrings abändern, dann würde deine Methode immernoch den gleichen Code haben und genauso funktionieren, nur das du diesmal als Instanz eine TXYList, eine TListBox.Items, TComboBox.Items, TMemo.Lines und auch TStringList übergeben kannst (und noch viele andere) und mit diesen allen arbeitet sie zusammen. Wärst du bei dem höher spezialisierten Typ TStringList geblieben, müsstest du für jeden aufgezählten Kandidaten eine eigene Methode implementieren - dabei wäre der Inhalt immer der gleiche, nur der Parametertyp in der Signatur würde sich beständig ändern.

Das ist auch der Grund für TStrings: Sie bilden eine Menge an Grundfunktionalität ab, was alle gleich haben: eine Liste von Strings zu verwalten. Dabei gibt es noch die Besonderheit: TStrings ist eine abstrakte Basisklasse. Dies bedeutet: sie definiert die Properties und Methoden und alles was man braucht um mit einer Liste von Strings zu arbeiten, tut aber an keiner Stelle irgendwas mit Strings machen. Sie definiert diese Grundfunktionalität und die Ableitungen setzen diese dann um. TStringList oder auch TMemoStrings wiederrum kümmern sich um die Speicheralloziierung (bzw. das Setzen und Abfragen der visuellen Komponenten beim Zugriff auf .Lines). Da TStrings nur ein leeres Gerüst bietet, bekommst du Probleme wenn du eine Instanz von TStrings anlegst und damit arbeiten willst: du bekommst einen abstrakten Fehler, da TStrings keine Strings halten kann. Dies implementieren erst die Ableitungen, aber die ganzen Ableitungen haben alle eins gemeinsam: sie erben alle die Grundfunktionalität von TStrings. Und damit kann man sie allgemein benutzen, ansprechen, etc - wenn man sich auf den Typ TStrings konzentriert. Eine Variable kann immer höher, abgeleitete Klassen als Instanzen aufnehmen.

Anhang:

Die Instanzen sind erst zur Laufzeit vorhanden und in den Variablen abgelegt. Ob in der Variablen nun eine TStringList oder eine TXYListe enthalten ist, kann dir der Compiler zur Designzeit nicht beantworten. D.h. du kannst z.B. nicht eine von TXYListe neu eingeführte Methode aufrufen, wenn die Variable vom Typ TStringList ist. Aber du kannst abfragen ob eine höhere Spezialisierung vorhanden ist, mit dem IS Operator. Dieser liefert bei der Abfrage true, wenn die angefragte Klasse oder deren Ableitung als Instanz vorliegen.
  Mit Zitat antworten Zitat
Benutzerbild von Jazzman_Marburg
Jazzman_Marburg

Registriert seit: 2. Aug 2004
359 Beiträge
 
#6

Re: OOP: Erzeugen von Objekten & Co.

  Alt 21. Okt 2009, 20:14
Klasse!

Vielen Dank.

Gruß
Jaszzman
  Mit Zitat antworten Zitat
Antwort Antwort


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 19:33 Uhr.
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