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

 
Informacje
Ostatnia modyfikacja 27-01-2006 15:56 Ostatni autor Adam Boduch
Ilość wyświetleń 8877 Wersja 5
Komentarz
manfredek dnia 28-04-2008 21:24
A ja nie mogę patrzeć na nieskończoną rekurencję.
migajek dnia 20-01-2006 20:01
Adam: wiem o tym, ale jako konserwatysta nie moge wprost patrzec na kod z polskimi znakami :}
Adam Boduch dnia 20-01-2006 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 ;)

Katalog
Copyright © 2000-2006 by Coyote Group 0.9.3-pre3
Czas generowania strony: 0.0754 sek. (zapytań SQL: 9)