Programowanie w języku Delphi » OOP

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:

type
  TFiat = class
    procedure Jedz;
  end;
 
  TMaluch = class(TFiat)
    procedure Jedz;
  end;
 
  TFiat125 = class(TFiat)
    procedure Jedz;
  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.Jedz;
begin
  ShowMessage('Metoda Jedz z klasy TFiat125');
end;
 
{ TFiat }
 
procedure TFiat.Jedz;
begin
  ShowMessage('Metoda Jedz z klasy TFiat');
end;
 
{ TMaluch }
 
procedure TMaluch.Jedz;
begin
  ShowMessage('Metoda Jedz z klasy TMaluch');
end;


Warto zastanowić się, jaki będzie rezultat wywołania poniższego kodu:

var
  Klasa : TFiat;
begin
  Klasa := TMaluch.Create;
  Klasa.Jedz;
  Klasa.Free;
end;


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 Jedz 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 Jedz; virtual;
  end;
 
  TMaluch = class(TFiat)
    procedure Jedz; override;
  end;
 
  TFiat125 = class(TFiat)
    procedure Jedz;
  end;


Klauzula override w klasie TMaluch wiążę się z przykrywaniem metody Jedz. Po wprowadzeniu takich poprawek i ponownym uruchomieniu programu w okienku informacyjnym zostanie wyświetlony napis: Metoda Jedz 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ż: