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

0 komentarzy