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 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;


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

var
  Klasa : TFiat;
begin
  Klasa := TMaluch.Create;
  Klasa.Jedź;
  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 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;


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ż:

Informacje
Ostatnia modyfikacja 16-01-2006 11:11 Ostatni autor Adam Boduch
Ilość wyświetleń 6320 Wersja 1
Komentarz

Katalog
Copyright © 2000-2006 by Coyote Group 0.9.3-pre3
Czas generowania strony: 0.0540 sek. (zapytań SQL: 9)