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;