Abstract
Adam Boduch
abstract - słowo kluczowe języka Delphi
Klauzulą abstract może być opatrzona dowolna metoda w klasie. Wówczas taka metoda staje się metodą abstrakcyjną.
Metody abstrakcyjne są takimi metodami, które nie posiadają implementacji ? jedynie deklaracje w klasie. I wystarczy, że zapamiętasz to zdanie. Deklarowanie metod abstrakcyjnych wiąże się z dziedziczeniem ? projektant klasy bazowej zaznacza, że klasy potomne muszą zawierać metodę o danej nazwie.
Przykład: jeden programista w zespole tworzy klasę TBasePlayer
, w której definiuje abstrakcyjną metodę Play
(metoda jest w klasie, ale w kodzie nie znajduje się jej implementacja). Drugi programista tworzy klasę TSpiderMan
, która dziedziczy po TBasePlayer
i która będzie musiała zawierać metodę Play
, jednak we wszystkich klasach potomnych metoda ta może wyglądać inaczej.
Metodę abstrakcyjną definiuje się z użyciem słowa kluczowego abstract:
TBasePlayer = class
// jedynie definicja metody
procedure Play; virtual; abstract;
end;
Taki kod zostanie skompilowany bez problemu, mimo że kod nie zawiera implementacji metody Play
. Uwaga! Metoda abstrakcyjna musi być jednocześnie wirtualna lub dynamiczna (nie może być statyczna), w przeciwnym przypadku kompilator wyświetli komunikat o błędzie: [Error] Unit1.pas(38): Abstract methods must be virtual or dynamic.
Teraz można zadeklarować klasę potomną, która musi zawierać metodę Play
:
TSpiderMan = class(TBasePlayer)
end;
Jeżeli jej nie zadeklarujemy, podczas próby utworzenia instancji klasy kompilator poinformuje o błędzie ([Error] Unit1.pas(103): Constructing instance of 'TSpiderMan' containing abstract method 'TBasePlayer.Play'):
var
Player : TSpiderMan;
begin
Player := TSpiderMan.Create;
Player.Free;
end;
Możemy w tym momencie zadeklarować metodę Play
w klasie TSpiderMan
:
TSpiderMan = class(TBasePlayer)
procedure Play; override;
end;
Jak będzie wyglądać implementacja klasy TSpiderMan
? To już zależy od programisty:
var
Player : TSpiderMan;
begin
Player := TSpiderMan.Create;
Player.Play;
Player.Free;
end;
{ TSpiderMan }
procedure TSpiderMan.Play;
begin
ShowMessage('Metoda Play z klasy TSpiderMan');
end;
Uogólniając, trzeba zapamiętać, że metody abstrakcyjne nie posiadają implementacji.
Zobacz też: