Programowanie w języku Delphi » OOP

Metody proste

Metody proste (ang. simple class methods) lub metody klas (ang. class methods) to specjalny typ metod. Dzięki metodom tego typu nie jest konieczne wywołanie konstruktora klasy - ba - nie jest konieczne nawet deklarowanie instancji klasy. Jak sama nazwa wskazuje, metody tego typu wywoływane są z poziomu klasy - nie obiektu!

Chcąc zadeklarować metodę tego typu, deklarację należy poprzedzić słowem kluczowym Class. Spójrz na poniższy kod:

type
  TFiat = class
    procedure Jedz; virtual;
 
    type
      TMaluch = class
      public
        class var Zmienna : Boolean;
        class procedure Jedz;
      end;
  end;


Dostęp do klasy może wyglądać następująco:

begin
  TFiat.TMaluch.Zmienna := True;
  TFiat.TMaluch.Jedz;
end;


Należy jednak pamiętać o specyficznej deklaracji pola lub metody:

class var Zmienna : Boolean; // zwróć uwagę na słówko var
class procedure Jedz;


Uwaga! Taka konstrukcja zadziała jedynie w Delphi dla .NET

Taka konstrukcja pozwala na szybkie użycie klasy bez wywoływania jej konstruktora, a nawet bez inicjalizacji obiektu wskazującego na ową klasę. Metody tego typu mogą odwoływać się do innych elementów klasy (metod czy pól) lecz one również muszą być zadeklarowane z użyciem słowa kluczowego class. W przeciwnym wypadku kompilator wyświetli błąd: [Error] Project.dpr(20): E2076 This form of method call only allowed for class methods. Przykładem tego jest poniższy fragment kodu:

type
  TMyClass = class
   private
      S : String;
   public
     class procedure Foo;
     procedure Bar;
   end; 
 
{ .. } 
 
procedure TMyClass.Bar;
begin
  S := 'Hello'; // błąd
  Bar;  // błąd
end;


Prawidłowa wersja tego kodu powinna wyglądać następująco:

type
  TMyClass = class
   private
      class var S : String;
   public
     class procedure Foo;
     class procedure Bar;
   end; 
 
{ .. } 
 
procedure TMyClass.Bar;
begin
  S := 'Hello'; // dobrze
  Bar;  // dobrze
end;


Jeżeli deklaracja została opatrzona klauzulą class, to jej definicja również musi ją zawierać

Również w przypadku, gdy metoda jest wirtualna ? klasa potomna także musi zawierać klauzulę class (przykład poniżej):

type
  TFiat = class
    procedure Jedz; virtual;
 
    type
      TMaluch = class
      public
        class var Zmienna : Boolean;
        class procedure Jedz; virtual;
      end;
  end;
 
  TSamochodzik = class(TFiat.TMaluch)
  public
    class procedure Jedz; override;
  end; 


Jak wspominałem, aby skorzystać z metod prostych, nie jest potrzebna zmienna wskazująca na klasę. Możliwe jest jednak wykorzystanie takich metod oraz zmiennych po zainicjalizowaniu klasy:

var
  Maluch : TFiat.TMaluch;
begin
  Maluch := TFiat.TMaluch.Create;
  Maluch.Zmienna := False;
  Maluch.Jedz;
  Maluch.Free;
end; 


Przestrzegam jednak w tym miejscu przed pominięciem wywołania konstruktora. Próba uzyskania dostępu do zmiennej lub do metody w przypadku pominięcia konstruktora może się skończyć błędem aplikacji.

Metody zadeklarowane jako simple class methods nie będą dostępne na liście Code Completion w przypadku próby odwołania poprzez obiekt (tak jak to ma miejsce w powyższym kodzie źródłowym).

Z ciała metody, która jest metodą prostą, można uzyskać dostęp do elementów klasy. Innymi słowy ? dostępna jest zmienna Self, tak więc możemy zarówno odczytywać, jak i przypisywać dane polom, a także wywoływać inne metody, pod warunkiem, że będą to metody proste.

Proste metody klasy to element, który jest również dostępny w języku Delphi dla Win32. Należy wziąć pod uwagę fakt, iż w Delphi dla Win32, nie można deklarować pól poprzedzonych słowem class: class var S: String. Automatycznie więc, metody proste nie mogą przypisywać żadnych danych do pól klasy.

Zobacz też:

3 komentarze

manfredek 2008-04-28 21:24

A ja nie mogę patrzeć na nieskończoną rekurencję.

migajek 2006-01-20 20:01

Adam: wiem o tym, ale jako konserwatysta nie moge wprost patrzec na kod z polskimi znakami :}

Adam Boduch 2006-01-20 17:40

Migajku: W Delphi dla .NET, dzie istnieja te metody proste, dozwolone jest korzystanie z polskich znakow z nazwach metod i w calym kodzie ;) Ale ok - niech tak juz zostanie ;)