Składnia języka » Operatory języka

As

  • 2010-10-31 18:27
  • 0 komentarzy
  • 787 odsłon
  • Oceń ten tekst jako pierwszy
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ż: