Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Eine Frage an die Cracks: erben (https://www.delphipraxis.net/171629-eine-frage-die-cracks-erben.html)

Popov 16. Nov 2012 06:08

Delphi-Version: 7

Eine Frage an die Cracks: erben
 
Ich erkläre gerade einem in einem anderen Forum etwas und will mit meinem nicht vorandenem Wissen prallen.

Also, ich erstelle meine eigene Klasse und leite sie aus einer anderen Klasse ab:

Delphi-Quellcode:
type
  TMyBitmap = class(TBitmap)
    function QuadratPixel: Integer;
  end;
Jetzt die Frage: erstelle ich nur eine Verbindung zu der anderen Klasse plus meiner Methode oder eine Kopie von der anderen Klasse inc. meiner Methode?

Nochmal: wenn ich meine Klasse erstelle, dann erbt meine Klasse alles von der Vorgänger-Klasse. Meine Frage bezieht sich drauf wie dieses Erben intern aussieht. Wird bei der Erstellung meines Objekts nur mein Einzeiler beachtet mit dem höflichen Vermerk, für den Rest mal bitte schön irgendwo bei der TBitmap zu gucken, oder es wird eine komplett neue Superklasse kreiert, die die Bitmap beinhaltet plus meine Methode. Oder wird einer Art Container erstellt der, um bei der Bitmap zu bleiben, alle sechs Klassen (meinetwegen Abbildungen) beinhaltet (jede schön für sich separat). Wie sieht der Vorgang des Erbens eigentlich aus?

Zacherl 16. Nov 2012 06:45

AW: Eine Frage an die Cracks: erben
 
Ich schätze mal der eigentliche Code, also alle Methoden sind irgendwo statisch im Code gelinkt. Wenn ich mich recht erinnere wird vor dem Aufruf einer Methode die Instanz in ECX abgelegt. Also rein von dem Standpunkt aus gesehen erstellst du keine Kopie, sondern nur eine Erweiterung. Für die Klassendeklaration ansich gillt das selbe, wobei ich hier nicht ganz genau weiß, wie es bei virtuellen Methoden aussieht.

Prinzipiell gesehen trifft deine Beschreibung mit dem "höflichen Vermerk" wohl am besten zu.

Perlsau 16. Nov 2012 07:17

AW: Eine Frage an die Cracks: erben
 
Soweit ich weiß, erbst du mit dem Erstellen einer neuen Klasse aus einer vorhandenen alle Methoden und Properties. Es wird also eine neue eigenständige Klasse angelegt, die alle Methoden und Properties der Eltern-Klasse enthält, weil sie die eben geerbt hat. Führst du neue Methoden und Properties ein, erweiterst du deine neue Klasse um dieselben. Wählst du für eine neue Methode oder ein neues Property einen Variablen-Namen, der bereits in der Eltern-Klasse für eine Methode oder ein Property Verwendung fand, überschreibst du diese Methode bzw. dieses Property nur in deiner neuen Klasse, nicht in der Elternklasse. Für alle Methoden und Properties, die unverändert von der Eltern- in die Kindklasse übernommen werden, existieren selbstverständlich keine Kopien für deine neue Klasse, sondern lediglich Referenzen auf die Elternklasse. Wenn du das aus irgend einem Grund nicht willst, mußt du dir den gesamten Code der Elternklasse in deine neue Klasse kopieren. Das wäre letztlich aber nicht im Sinne der Vererbungstechnik.

Meine Einschränkung "soweit ich weiß" bezieht sich auf meine einzige Erfahrung mit der Vererbung einer Klasse, als ich vor einiger Zeit eine TjvRichText-Komponente geklont habe, um ihr diverse neue Methoden zu verpassen. Natürlich besteht die Funktionalität der neuen Klasse auf dem Vorhandensein der alten: Ohne Jedi-Komponenten würde meine neue Klasse nicht funktionieren, weil dann der Vererbungsvorgang scheitern würde.

Sir Rufo 16. Nov 2012 07:22

AW: Eine Frage an die Cracks: erben
 
Zitat:

Zitat von Perlsau (Beitrag 1191423)
Meine Einschränkung "soweit ich weiß" bezieht sich auf meine einzige Erfahrung mit der Vererbung einer Klasse, als ich vor einiger Zeit eine TjvRichText-Komponente geklont habe, ...

Das glaube ich ja mal gar nicht ...

Jede Form die du erstellst ist eine Ableitung einer Klasse (TForm) die du entsprechend erweiterst. ;)

mkinzler 16. Nov 2012 07:29

AW: Eine Frage an die Cracks: erben
 
Zitat:

Natürlich besteht die Funktionalität der neuen Klasse auf dem Vorhandensein der alten: Ohne Jedi-Komponenten würde meine neue Klasse nicht funktionieren, weil dann der Vererbungsvorgang scheitern würde.
Wäre es eine Kopie, würde das Original nicht mehr benötigt werden.

Perlsau 16. Nov 2012 07:29

AW: Eine Frage an die Cracks: erben
 
Zitat:

Zitat von Sir Rufo (Beitrag 1191425)
Das glaube ich ja mal gar nicht ...
Jede Form die du erstellst ist eine Ableitung einer Klasse (TForm) die du entsprechend erweiterst. ;)

Stimmt natürlich, das würde ich so auch nicht glauben :)

Ich hätte schreiben sollen "abgesehen von automatischer Vererbung beim Erstellen einer Form".

Perlsau 16. Nov 2012 07:31

AW: Eine Frage an die Cracks: erben
 
Zitat:

Zitat von mkinzler (Beitrag 1191427)
Wäre es eine Kopie, würde das Original nicht mehr benötigt werden.

Exakt!

Jumpy 16. Nov 2012 08:36

AW: Eine Frage an die Cracks: erben
 
Muss man das nicht trennen nach Feldern und Methoden? Sprich was passiert bei Vererbung mit Feldern, sprich welcher Speicher wird wo wofür reserviert! Und wie werden die Methoden zugeordnet? Gibt es da nicht irgendwelche Tabellen (Mir schwirrt aus der Schule noch das Stichwort Method-Table im Kopf rum) wo (vom Compiler?) geguckt wird, welche Methode gerade gefragt ist (Polymorphie)?

Popov 16. Nov 2012 08:43

AW: Eine Frage an die Cracks: erben
 
Machen wir ein simples Experiment

Delphi-Quellcode:
type
  TMyBitmap = class(TBitmap)
  end;

procedure TForm1.Button2Click(Sender: TObject);
var
  MyBitmap: TMyBitmap;
begin
  MyBitmap:= TMyBitmap.Create;
  MyBitmap.LoadFromFile('c:\abc.bmp');
end;
Führe ich das Schritt für Schritt aus, dann lande ich nicht in meiner geerbten Methode von TMyBitmap, die physikalisch nicht da ist, sondern von TBitmap. Die Frage ist nur was da abläuft. Entweder dem Debuger fällt die Alternative, also greift er zum zeigen auf die Methode von TBitmap, oder was wohl wahrscheinlich ist, TMyBitmap erbt nicht die Methode, sondern nur ihre Adresse drau. Die Klasse hat nichts geerbt, sondern nur die Adresse des Vorgängers und gibt den Auftrag an den Vorgänger weiter. Oder kann man das so deuten: die Klasse hat schon alles geerbt, aber nur theoretisch. Aber wozu die Methode zwei mal im Speicher haben wen die vom Vorgänger identisch ist.

Natürlich sehe ich was ich sehe, mich interessiert eher die Philosophie dahinter.

mkinzler 16. Nov 2012 08:57

AW: Eine Frage an die Cracks: erben
 
Es wäre ja unsinnig, dass beim Vererben der komplette Code kopiert wird. Wird eine Methode der superklasse nicht verdeckt, wird natürlich die der Superklasse aufgerufen ( referenziert).

Perlsau 16. Nov 2012 09:09

AW: Eine Frage an die Cracks: erben
 
Zitat:

Zitat von Jumpy (Beitrag 1191439)
Muss man das nicht trennen nach Feldern und Methoden? Sprich was passiert bei Vererbung mit Feldern, sprich welcher Speicher wird wo wofür reserviert! Und wie werden die Methoden zugeordnet? Gibt es da nicht irgendwelche Tabellen (Mir schwirrt aus der Schule noch das Stichwort Method-Table im Kopf rum) wo (vom Compiler?) geguckt wird, welche Methode gerade gefragt ist (Polymorphie)?

Ich glaube nicht, daß ich genau wissen möchte, welcher Speicher wann, wo und wofür reserviert wird, dazu ist die Speicherverwaltung von Delphi für meine Verhältnisse einfach zu komplex. Soweit ich aber weiß, wird genau die Speichergröße reserviert, die für die Referenzen auf das Eltern-Objekt notwendig ist. Gibst du neue Methoden oder Properties ein, wird entsprechend weiterer Speicher reserviert, dito auch beim Überschreiben von Methoden und Properties. Alles, was darüber hinausgeht, hält mich nur vom Arbeiten ab :stupid:, deshalb klinke ich mich jetzt hier auch wieder aus.

mkinzler 16. Nov 2012 09:25

AW: Eine Frage an die Cracks: erben
 
Methoden(properties) sind grundsätzlich nur Zeiger, egal ob die Methode geerbt ist oder nicht.
http://docwiki.embarcadero.com/RADSt...e_Datenformate

Mach dich mal nach der VMT schlau

Sir Rufo 16. Nov 2012 09:32

AW: Eine Frage an die Cracks: erben
 
Zitat:

Zitat von Jumpy (Beitrag 1191439)
Muss man das nicht trennen nach Feldern und Methoden? Sprich was passiert bei Vererbung mit Feldern, sprich welcher Speicher wird wo wofür reserviert! Und wie werden die Methoden zugeordnet? Gibt es da nicht irgendwelche Tabellen (Mir schwirrt aus der Schule noch das Stichwort Method-Table im Kopf rum) wo (vom Compiler?) geguckt wird, welche Methode gerade gefragt ist (Polymorphie)?

Nein, aber man muss unterscheiden zwischen einer Klasse und einer Instanz.

Die Instanz ist ein Speicherbereich, der mit dem "Klassenstempel" eine besondere Struktur bekommt. Das war es schon.
Die Methoden werden wie eine procedure einfach ausgeführt (der einzige Unterschied ist das Mitführen von Self einer Referenz auf die eigene Instanz => Speicherbereich)

Greift man innerhalb der Methode nicht auf die Instanz zurück, so kann man diese auch einfach aufrufen.

Delphi-Quellcode:
TFoo = class
private
  FValue : Integer;
public
  function Calc( a, b : Integer) : Integer; overload;
  function Calc( a : Integer ) : Integer; overload;
end;

function TFoo.Calc( a, b : Integer ) : Integer;
begin
  Result := a + b;
end;

function TFoo.Calc( a : Integer ) : Integer;
begin
  Result := Calc( a, FValue );
end;

var
  LFoo : TFoo;
begin
  LFoo.Calc( 3, 4 ); // Keine AV obwohl es keine Instanz gibt
  LFoo.Calc( 3 ); // es gibt eine AV, weil in der Methode auf die Instanz zugegriffen wird
end;
Was allerdings gleich ist, sind Klassenvariablen, die werden nicht geklont, sondern die sind in jeder Ableitung da und vor allem gleich!

Delphi-Quellcode:
TFoo = class
  class var _Value : Integer;
end;

TFoo2 = class( TFoo )
end;

begin
  TFoo._Value := 42;
  Assert( TFoo._Value = TFoo2._Value );
end;

DeddyH 16. Nov 2012 09:39

AW: Eine Frage an die Cracks: erben
 
Zur VMT und DMT hat sirius in diesem Thread eine IMO sehr gute und ausführliche Beschreibung geschrieben.


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