Sprawdzanie czy obiekt implementuje dany interfejs

0

Mam kilka klasy dziedziczacych po roznych przodkach, ale poniewaz dzialaja w tym samym srodowisku,
maja sporo wspolnych cech. Wiec kod wyglada tak:

    for i := 0 to ComponentCount - 1 do begin
      if Components[i] is TKlasaA then
        TKlasaA(Components[i]).doSomethink;
      if Components[i] is TKlasaB then
        TKlasaB(Components[i]).doSomethink;
      if Components[i] is TKlasaC then
        TKlasaC(Components[i]).doSomethink;
      if Components[i] is TKlasaD then
        TKlasaD(Components[i]).doSomethink;
    end;

Zeby moc obslugiwac obie klasy za jednym razem, utworzylem interfejs
zawierajacy wspolne metody i pola.

no i chcialem zrobic cos takiego:

    for i := 0 to ComponentCount - 1 do
      if Components[i] is IElement then
        IElement(Components[i]).doSomethink;

ale Delphi mowi ze operatora is nie da sie stosowac w takim kontekscie...
jak zatem mam sprawdzic czy jakis obiekt implementuje dany interfejs?

0
function Supports(const Instance: IInterface; const IID: TGUID; out Intf): Boolean; overload;
function Supports(const Instance: TObject; const IID: TGUID; out Intf): Boolean; overload;
function Supports(const Instance: IInterface; const IID: TGUID): Boolean; overload;
function Supports(const Instance: TObject; const IID: TGUID): Boolean; overload;
function Supports(const AClass: TClass; const IID: TGUID): Boolean; overload;
0

czy duzym nietaktem byloby proszenie o odrobine wyjasnien :>

0

Na przykład tak:

  if Supports(TwojObiekt, ITwojInterfejs) then ....

lub tak:

var
  SomeObj: ITwojInterfejs;

{...}

  if Supports(TwojObiekt, ITwojInterfejs, SomeObj) then ....

W tym drugim przypadku masz gotowy do wykorzystania SomeObj.

0

ehh...
na poczatku zrozumialem ze mam sobie napisac taka funkcje:p

akurat w tym przypadku odpowiedz w stylu:
supports+F1
bylaby latwiejsza w zrozumieniu:p

dzieki

0

no dobrze...
tylko <ort>z kad</ort> mam wziac IID mojego interfejsu?

0
Johny_Morfina napisał(a)

no dobrze...
tylko z kad mam wziac IID mojego interfejsu?

Tak jak w podanym przykładzie. If Supports(Components[i], IMyInterface) then....

Tu wpisujesz po prostu interfejs, którego implementację testujesz.

0

no i wszystko gra.

ciekawych rzeczy sie dowiedzialem przy okazji o interfejsach...
przede wszystkim tego ze malo o nich wiem:/

jakby ktos byl ciekawy to znalazlem taka prezentacje

0

Sympatyczne materiały, dzięki za wklejenie linka, na pewno coś dla siebie znajdę :)

1 użytkowników online, w tym zalogowanych: 0, gości: 1