Formatki, Framy i interfejsy

0

Heja

Tak od wczoraj zaczęło mnie nurtować pewne pytanie, nakreślę o czym myślę:

Mam sobie pewną aplikację, stosuje w niej sporo dziedziczenia jeśli chodzi o formatki i frame'y. Innymi słowy zawsze mam coś bazowego, gdzie w razie potrzeby mogę zaimplementować jakąś wspólną funkcjonalność - i wszystko git. Jednak ostatnio stanąłem przed pewnym zagadnieniem (w sumie możba by rzec książkowym - jak gdzie piszą o interfejsach to dają taki właśnie przykład), mianowicie z pewnych przyczyn miałem potrzebe zaimplementowania pewnej funkcjonalności ale w kilku nie do końca powiązanych klasach. Więc pomyślałem - interfejsy ! Zrobiłem sobie prościutki unit z szablonem interfejsu (jedna procedura), i dopisałem tenże interfejs do kilku frame'ów

TJakisFram1 = class (TBazowyFram1, IMojIntrefejs)
TJakisFram2 = class (TBazowyFram2, IMojIntrefejs)

W klasach oczywiscie dodałem implementacje aż jednej metody wymaganej dla interfejsu, i ... wszystko działa. Iterując gdzieś w nadrzędnych warstwach sprawdzam:

If Supports(Components[i], IMojInterfejs) then
(Components[i] as IMojInterfejsc).MojaMetoda;

Wszystko śmiga aż miło, więc w czym problem ... ?

Otóż, może za bardzo drąże temat, ale czytając tu i tam na temat interfejsów, wszędzie pojawiało się stwierdzenie: ... klasa implementująca interface IInterface powinna implementować:

QueryInterface
_AddRef
_Release

a ja ... tego nie zrobiłem. Też czytając tu i ówdzie, przejawiało się stwierdzenie, że najlepiej do konstruowania klas implementujących interfejsy, używać jako klasę bazową TInterfacedObject - no ale jak ja jej mam użyć w przypadku TForm czy TFrame ?

Mam w sumie definicję tych metod w źródłach do TDE. Generalnie klasa, ma pole fRefCount i nic nadzwyczajnego z nim nie robi. AddRef zwiększa owy licznik (bezpiecznie wątkowo), Release zmiejsza i przy 0 wywołuje Destroy. A QueryInterface wywołuje tam jakąś funkcję nie pamiętam jaką.
Zmierzam do tego że mógłbym zaimplementować to w tych formatkach, tylko chciałem zapytać czy muszę ? Przecież nie będę Destroy'ował formatki, kiedy jakiś fragment skończy korzystać z jakiegoś jej interfejsu ...

Reasumując:

  1. Czy muszę implementować QI, AddRef, Release jeśli chcę wyposażyć formatki w jakiś interfejs ?
  2. Dlaczego teraz nic mi Delphi nie krzyczy że tego nie zrobiłem ?
  3. Dlaczego teraz to działa ?

Z góry dziękuję za podpowiedzi i pozdrawiam.
b

0

Eh na grupach mnie uświadomili, że jak zwykle siedzę na odpowiedzi : )

Dla potomnych: IInterface, jest implementowany przez TComponent ; ]

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