AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Sonstige Fragen zu Delphi Delphi Objekt kopieren, ohne unnötige methoden/felder usw.
Thema durchsuchen
Ansicht
Themen-Optionen

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

Ein Thema von Pseudemys Nelsoni · begonnen am 11. Dez 2004 · letzter Beitrag vom 12. Dez 2004
Antwort Antwort
Benutzerbild von Pseudemys Nelsoni
Pseudemys Nelsoni

Registriert seit: 24. Dez 2002
Ort: Hamburg-Harburg
3.551 Beiträge
 
#1

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

  Alt 11. Dez 2004, 23:59
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?
Mario
MSN: cyanide@ccode.de
  Mit Zitat antworten Zitat
Christian Seehase
(Co-Admin)

Registriert seit: 29. Mai 2002
Ort: Hamburg
11.116 Beiträge
 
Delphi 11 Alexandria
 
#2

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

  Alt 12. Dez 2004, 00:03
Moin Mario,

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

([oh]private-, protected- und public-Elemente[/oh])
Tschüss Chris
Die drei Feinde des Programmierers: Sonne, Frischluft und dieses unerträgliche Gebrüll der Vögel.
Der Klügere gibt solange nach bis er der Dumme ist
  Mit Zitat antworten Zitat
Benutzerbild von Pseudemys Nelsoni
Pseudemys Nelsoni

Registriert seit: 24. Dez 2002
Ort: Hamburg-Harburg
3.551 Beiträge
 
#3

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

  Alt 12. Dez 2004, 00:10
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
Mario
MSN: cyanide@ccode.de
  Mit Zitat antworten Zitat
Robert_G
(Gast)

n/a Beiträge
 
#4

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

  Alt 12. Dez 2004, 00:13
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 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 )
  Mit Zitat antworten Zitat
Benutzerbild von Pseudemys Nelsoni
Pseudemys Nelsoni

Registriert seit: 24. Dez 2002
Ort: Hamburg-Harburg
3.551 Beiträge
 
#5

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

  Alt 12. Dez 2004, 00:18
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
Mario
MSN: cyanide@ccode.de
  Mit Zitat antworten Zitat
tommie-lie
(Gast)

n/a Beiträge
 
#6

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

  Alt 12. Dez 2004, 12:01
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:

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

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

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 ).

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

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

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



Edit: Nachdem ich gemerkt habe, daß es nicht gut aussah, doch noch Delphi-Tags hinzugefügt *g*
  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 01:11 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