Delphi OOP

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 TBasePlayeri 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ę Playw 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ż:

0 komentarzy