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:
- Czy muszę implementować QI, AddRef, Release jeśli chcę wyposażyć formatki w jakiś interfejs ?
- Dlaczego teraz nic mi Delphi nie krzyczy że tego nie zrobiłem ?
- Dlaczego teraz to działa ?
Z góry dziękuję za podpowiedzi i pozdrawiam.
b