Jako że to mój pierwszy post to witam wszystkich. Podczas tworzenia małego programu natrafiłem na dziwną rzecz, mianowicie możliwość wykonania metody bez tworzenia obiektu danej klasy. Dla lepszego zobrazowania sytuacji kod:
Deklaracje klas
type
TKlasa1 = class
procedure ABC; //ShowMessage('k1');
constructor Create; //ShowMessage('konstruktor_k1');
end;
TKlasa2 = class
public
PKLASA: TKlasa1;
procedure XYZ; // ShowMessage('k2');
end;
Kod testowy:
procedure TEST;
var
K1: TKlasa1;
K2: TKlasa2;
begin
// K1:= nil;
// K2:= nil;
// K1 := TKlasa1.Create;
// K2 := TKlasa2.Create;
//FreeAndNil(K1);
K1.ABC; // wyświetla komunikat "k1"
K2.PKLASA.ABC; // wyświetla komunikat "k1"
{ FreeAndNil(K1);
FreeAndNil(K2); }
end;
Na początku myślałem, że Delphi jakoś automatycznie wywołuje konstruktor klasy "Klasa1", co byłoby trochę dziwne. Po stworzeniu konstruktora okazało się, że tak nie jest. Kolejnym testem było przypisanie wartości "nil" do zmiennej "K1". Niestety oba komunikaty dalej się wyświetlały. Dopiero przypisanie "nil" do zmiennej "K2" dało prawie poprawny rezultat tzn. program wyświetlił jeden komunikat, a na drugim wywalił AV.
Macie jakieś pomysły, dlaczego w testowanym kodzie możliwe jest poprawne wywołanie metody nie statycznej bez stworzenia obiektu?