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