As
brodny
As - słowo kluczowe języka Delphi
Słowo kluczowe as konwertuje referencję obiektu na inny typ klasowy lub referencję interfejsu na inny typ interfejsu. Mówiąc inaczej, mając obiekt klasy, można "zmienić rodzaj" tego obiektu na inny obiekt. Normalne rzutowanie wygląda tak:
var
Foo: TFoo;
Bar: TBar;
begin
Foo := TFoo.Create;
// ...
Bar := TBar(Foo);
Kod ten skompiluje się tylko wtedy, gdy klasa TBar
jest klasą bazową (bezpośrednią lub pośrednią) klasy TFoo
. Zastosowanie w powyższym kodzie słowa kluczowego as wygląda następująco:
var
Foo: TFoo;
Bar: TBar;
begin
Foo := TFoo.Create;
// ...
Bar := Foo as TBar;
Jaka jest różnica pomiędzy przedstawionymi fragmentami kodu? Ano taka, że "operator" (będę tak nazywał słowo kluczowe as dla wygody) as jest "inteligentny". W jaki sposób przejawia się ta inteligencja? Otóż testuje on typ obiektu (sensowność rzutowania). W przypadku, gdy takiego sensu nie zauważy (np. rzutowanie typów klas niepowiązanych ze sobą dziedziczeniem), zwraca jako wynik pusty wskaźnik (Nil). Wykonanie na nim jakiejkowiek operacji powoduje błąd ochrony dostępu (Access Violation). Możnaby spytać, dlaczego to jest lepsze od bezwzględnego wykonania operacji? Przede wszystkim dlatego, że pozwala nam uniknąć błędów oraz nieprzewidzianych działań programu. Co by się stało, gdyby aplikacja wykonała jakiś przypadkowy kod?
Jednak największa przydatność operatora as ujawnia się we współpracy z interfejsami. Poniższy kod:
var
Interfejs: IUnknown;
OtherIntf: IMyInterface;
begin
Interfejs := JakasFunkcjaZwracajacaWskazanieNaInterfejs;
// ...
if Interfejs.QueryInterface(IMyInterface, OtherIntf) <> 0 then
OtherIntf := nil
else begin
OtherIntf._AddRef;
// ...
end;
end;
może być przy użyciu operatora as zapisany jako:
var
Interfejs: IUnknown;
OtherIntf: IMyInterface;
begin
Interfejs := JakasFunkcjaZwracajacaWskazanieNaInterfejs;
// ...
OtherIntf := Interfejs as IMyInterface;
if OtherIntf <> nil then
// ...
Dodać należy, że operator as jest często używany we współpracy z innym słowem kluczowym - Is.
Zobacz też: