Programowanie w języku Delphi

Metody proste

  • 2010-10-31 18:27
  • 3 komentarze
  • 3507 odsłon
  • Oceń ten tekst jako pierwszy
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 ;)