Przedefiniowanie metod
Pojęcie przedefiniowania metod dotyczy jedynie klas, a konkretnie jest związane z ich dziedziczeniem.
Klasa, która dziedziczy po innych klasach, przejmuje ich metody, ale te metody można w "nowej wersji klasy? unowocześniać lub całkowicie zmieniać. W programie zadeklarowałem trzy klasy:
Klasa TFiat jest klasą główną, natomiast TMaluch oraz TFiat125 są jej potomkami. Każda z nich posiada jednak metodę o tej samej nazwie. Implementacja tych metod jest dosyć prosta:
Warto zastanowić się, jaki będzie rezultat wywołania poniższego kodu:
Zwróćmy uwagę na to, że zmienna Klasa wskazuje na typ TFiat, ale wywoływany jest konstruktor klasy TMaluch. Jest to możliwe tylko w przypadku dziedziczenia, kiedy klasy są powiązane. Po uruchomieniu takiego programu w oknie zostanie wyświetlony napis: Metoda Jedź z klasy TFiat, gdyż Klasa wskazuje na klasę TFiat.
Istnieje również możliwość zmiany znaczenia metod znajdujących się w klasach bazowych bądź rozszerzenia ich funkcjonalności. Aby tego dokonać, należy właśnie oznaczyć metodę jako wirtualną lub dynamiczną ? statyczne metody nie mogą być przedefiniowane.
Wystarczy teraz nieco zmodyfikować deklarację klas do następującej postaci:
Klauzula override w klasie TMaluch wiąże się z przykrywaniem metody Jedź. Po wprowadzeniu takich poprawek i ponownym uruchomieniu programu w okienku informacyjnym zostanie wyświetlony napis: Metoda Jedź z klasy TMaluch.
W zaprezentowanym przykładzie pokazano właśnie zjawisko polimorfizmu. Metoda o tej samej nazwie może mieć zupełnie inne znaczenie w powiązanych ze sobą klasach. Projektanci klas bazowych często oznaczają metody dyrektywą virtual, aby możliwe było rozszerzenie funkcjonalności metody w klasach potomnych.
Zobacz też:
Klasa, która dziedziczy po innych klasach, przejmuje ich metody, ale te metody można w "nowej wersji klasy? unowocześniać lub całkowicie zmieniać. W programie zadeklarowałem trzy klasy:
type
TFiat = class
procedure Jedź;
end;
TMaluch = class(TFiat)
procedure Jedź;
end;
TFiat125 = class(TFiat)
procedure Jedź;
end;
TFiat = class
procedure Jedź;
end;
TMaluch = class(TFiat)
procedure Jedź;
end;
TFiat125 = class(TFiat)
procedure Jedź;
end;
Klasa TFiat jest klasą główną, natomiast TMaluch oraz TFiat125 są jej potomkami. Każda z nich posiada jednak metodę o tej samej nazwie. Implementacja tych metod jest dosyć prosta:
{ TFiat125 }
procedure TFiat125.Jedź;
begin
ShowMessage('Metoda Jedź z klasy TFiat125');
end;
{ TFiat }
procedure TFiat.Jedź;
begin
ShowMessage('Metoda Jedź z klasy TFiat');
end;
{ TMaluch }
procedure TMaluch.Jedź;
begin
ShowMessage('Metoda Jedź z klasy TMaluch');
end;
procedure TFiat125.Jedź;
begin
ShowMessage('Metoda Jedź z klasy TFiat125');
end;
{ TFiat }
procedure TFiat.Jedź;
begin
ShowMessage('Metoda Jedź z klasy TFiat');
end;
{ TMaluch }
procedure TMaluch.Jedź;
begin
ShowMessage('Metoda Jedź z klasy TMaluch');
end;
Warto zastanowić się, jaki będzie rezultat wywołania poniższego kodu:
Zwróćmy uwagę na to, że zmienna Klasa wskazuje na typ TFiat, ale wywoływany jest konstruktor klasy TMaluch. Jest to możliwe tylko w przypadku dziedziczenia, kiedy klasy są powiązane. Po uruchomieniu takiego programu w oknie zostanie wyświetlony napis: Metoda Jedź z klasy TFiat, gdyż Klasa wskazuje na klasę TFiat.
Istnieje również możliwość zmiany znaczenia metod znajdujących się w klasach bazowych bądź rozszerzenia ich funkcjonalności. Aby tego dokonać, należy właśnie oznaczyć metodę jako wirtualną lub dynamiczną ? statyczne metody nie mogą być przedefiniowane.
Wystarczy teraz nieco zmodyfikować deklarację klas do następującej postaci:
type
TFiat = class
procedure Jedź; virtual;
end;
TMaluch = class(TFiat)
procedure Jedź; override;
end;
TFiat125 = class(TFiat)
procedure Jedź;
end;
TFiat = class
procedure Jedź; virtual;
end;
TMaluch = class(TFiat)
procedure Jedź; override;
end;
TFiat125 = class(TFiat)
procedure Jedź;
end;
Klauzula override w klasie TMaluch wiąże się z przykrywaniem metody Jedź. Po wprowadzeniu takich poprawek i ponownym uruchomieniu programu w okienku informacyjnym zostanie wyświetlony napis: Metoda Jedź z klasy TMaluch.
W zaprezentowanym przykładzie pokazano właśnie zjawisko polimorfizmu. Metoda o tej samej nazwie może mieć zupełnie inne znaczenie w powiązanych ze sobą klasach. Projektanci klas bazowych często oznaczają metody dyrektywą virtual, aby możliwe było rozszerzenie funkcjonalności metody w klasach potomnych.
Zobacz też:


