Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Objekt kopieren, ohne unnötige methoden/felder usw. (https://www.delphipraxis.net/35796-objekt-kopieren-ohne-unnoetige-methoden-felder-usw.html)

Pseudemys Nelsoni 11. Dez 2004 22:59


Objekt kopieren, ohne unnötige methoden/felder usw.
 
hi,

ist es irgendwie möglich das ich einen Nachfolger einer klasse, einem vorfahren übergeben kann OHNE das die methoden/felder des nachfolgers mitgegeben werden?

wenn ich z.b sowas hier habe:

Delphi-Quellcode:
type
  blah1 = class
    var1: string;
  end;
  blah2 = class(blah1)
    var2: string;
  end;

...

procedure TForm1.Button1Click(Sender: TObject);
var
  blubb1: blah1;
  blubb2: blah2;
begin
  blubb1 := blah1.Create;
  blubb2 := blah2.Create;
  blubb2.var2 := 'hi';
  blubb1 := blubb2;
  showmessage((blubb1 as blah2).var2); // zeigt immernoch 'hi'
  blubb1.Free;
  blubb2.Free;
end;

dann kann ich immernoch auf die variable "var2" zugreifen... das ist aber unnötig da ich die am ende nichtmehr brauche.... also kann ich irgendwie dem vorfahr nur die methoden/felder übergeben die er selbst besitzt und sonst keine?

Christian Seehase 11. Dez 2004 23:03

Re: Objekt kopieren, ohne unnötige methoden/felder usw.
 
Moin Mario,

schau Dir mal in der Hilfe die Doku zur Sichtbarkeit an, speziell private.

([oh]private-, protected- und public-Elemente[/oh])

Pseudemys Nelsoni 11. Dez 2004 23:10

Re: Objekt kopieren, ohne unnötige methoden/felder usw.
 
moin christian,

danke für deine antwort. ich kenne mich mit dem thema sichbarkeit schon aus, die felder müssen öffentlich sein, da ich von aussen(beim nachfahren) auch zugreifen muss, selbst wenn ich sie privat hätte (was nicht sein darf), dann wäre der speicherplatz der felder immernoch nicht freigegeben oder? (darum gehtes mir u.a auch)

gruss mario

Robert_G 11. Dez 2004 23:13

Re: Objekt kopieren, ohne unnötige methoden/felder usw.
 
Befinden sich beide Klassen in einer Unit kann der Nachfahre auch auf private Member zugreifen.
Ich setze alle Member auf private, bei denen ich es für inkonsistent halte, dass sie der Nachfahre ändern/ausführen kann.
Die nötigen Werte für die privaten Felder des Vorfahren kann man ja über einen Constructor durchreichen oder sie ergeben sich durch eine Child-Owner Beziehung. ;)

Nachtrag:
Zitat:

Zitat von Pseudemys Nelsoni
moin christian,

danke für deine antwort. ich kenne mich mit dem thema sichbarkeit schon aus, die felder müssen öffentlich sein, da ich von aussen(beim nachfahren) auch zugreifen muss, selbst wenn ich sie privat hätte (was nicht sein darf), dann wäre der speicherplatz der felder immernoch nicht freigegeben oder? (darum gehtes mir u.a auch)

Das würde meinem Verständnis von OOP komplett widersprechen. (Zum Glück dem von Delphi auch :) )

Pseudemys Nelsoni 11. Dez 2004 23:18

Re: Objekt kopieren, ohne unnötige methoden/felder usw.
 
moin robert,

danke auch für deine antwort^^... im prinzip geht es mir nicht darum ob die methoden/felder privat sind sondern vielmehr darum, das wenn ich das objekt einem vorfahren übergebe einfach die Felder die im vorfahren nicht enthalten sind freigegeben werden

tommie-lie 12. Dez 2004 11:01

Re: Objekt kopieren, ohne unnötige methoden/felder usw.
 
Christian, Robert, ich glaube ihr redet ein wenig an Marios Problem vorbei... Es geht nicht darum, daß er überhaupt auf var2 zugreifen kann, sondern daß er das nach einem Typecast kann. Und da ist auch der Knackpunkt, "hi" wird nicht kopiert, sondern ist zufällig noch im Speicher:

Delphi-Quellcode:
blubb1 := blah1.Create;
Es wird eine Instanz von blah1 erzeugt, ein Pointer darauf ist in blubb1 (wird später aber wieder verworfen, ohne freuzugeben).

Delphi-Quellcode:
blubb2 := blah2.Create;
Es wird eine Instanz von blah2 erzeugt, ein Pointer darauf ist in blubb2.

Delphi-Quellcode:
blubb2.var2 := 'hi';
Der Pointer auf das Objekt wird dereferenziert und an die Stelle von "var2" wird "hi" geschrieben (daß der Longstring jetzt wiederum ein Pointer ist, vernachlässigen wir mal, es würde nur noch mehr verwirren :zwinker:).

Delphi-Quellcode:
blubb1 := blubb2;
Der Pointer, der auf die zweite Instanz (mit dem "hi" in "var2") zeigt, wird blubb1 zugewiesen.

Delphi-Quellcode:
showmessage((blubb1 as blah2).var2); // zeigt immernoch 'hi'
Der Pointer wird dereferenziert und gecastet, wodruch "var2" als Offset zum Speicherbereich wieder zur Verfügung steht. Da der Speicherbereich mit dem von "blubb2" referenzierten identisch ist, ist natürlich auch der Inhalt identisch, und im Offset von "var2" gibt's ein "hi".

Delphi-Quellcode:
blubb1.Free;
blubb2.Free;
Das würde ich nach diesen Operationen so nicht machen, kann gut gehen, kann aber auch verdammt ins Auge gehen :mrgreen:

Die Variable "var2" wird nicht in "blubb1" mitkopiert, sondern der Zeiger auf den Speicherbereich der blah2-Instanz wird einfach in "blubb1" geschrieben. Durch den Typecast erlaubt dir der Compiler den Zugriff auf das Offset von "var2", und weil du da vorher "hi" reingeschrieben hast und es zwischenzeitlich niemand da wieder weggenommen hat, ist es natürlich immer noch da :zwinker:



Edit: Nachdem ich gemerkt habe, daß es nicht gut aussah, doch noch Delphi-Tags hinzugefügt *g*


Alle Zeitangaben in WEZ +1. Es ist jetzt 15:30 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