Metody proste

Adam Boduch

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

4 komentarzy

To tylko kurs podstawowy.

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

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

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