Post by TygrysZeman pisze w
Post by ZemanWlasnie - podobnie jak Tygrys jestem ciekaw dlaczego ?
Głównie enkapsulacja. Dziedzicząc po TObjectList udostępnia się
wszystkie jego publiczne właściwości i metody. Jeżeli nie
dodaje się do TObjectList żadnych dodatkowych funkcjonalności,
tylko składuje się obiekty jakiegoś pojedyńczego typu (chyba
zdecydowana większość zastosowań), to dostęp w klasie potomnej
do sekcji public TObjectList jest raczej niepożądany.
To bardzo zależy, co chcesz osiągnąć. Jeżeli chcesz mieć
funkcjonalność TObject list to lepiej odziedziczyć, bo dodajesz
tylko nowe funkcje specyficzne dla Twojej klasy.
Tutaj chyba jeszcze ze mną nie polemizujesz?
Post by TygrysJeżeli chcesz natomiast zawęzić funkcjonalność, to oczywiście
możesz użyć enkapsulacji, ale wtedy wszystkie właściwości Twojej
klasy musisz napisać sam.
Funkcjonalności TObjectList nie zawężam. A jeżeli chodzi ci o
zawężanie funkcjonalności "mojej" klasy to:
- Zawężanie funkcjonalności jednocześnie zmniejsza ilość właściwości
i metod, które muszę sam dopisać;
- Właściwości i metod które muszę dopisać, jest w większości wypadków
mniej, niż gdybym poprawiał właściwości i metody przy dziedziczeniu -
w obu przypadkach dopisuję function Add(AObject: TMyClass): Integer;
- Jeżeli zawężam, to _chcę_ enkapsulować.
Post by TygrysI do każdego odwołania do obiektu
wewnętrznego dokładasz dodatkowy czas na przejście Twoich metod.
Hmm...
function Add(aObject: TMyClass): Integer;
begin
Result:= fMyList.Add(aObject)
end;
function Add(aObject: TMyClass): Integer;
begin
Result:= inherited Add(aObject)
end;
Post by TygrysNie jest złotą regułą wybór tego drugiego rozwiązania, zależy to
bardzo od celu, jaki dana klasa ma spełnić.
Nie jest. Ale ja nie piszę, że jest.
Post by TygrysNp. zobacz: TObjectList dziedziczy z TList a TStringList zawiera
wewnętrznie TList.
Co chyba potwierdza tezę, o dziedziczeniu w przypadku rozbudowy
funkcjonalności i użyciu jako pola gdy potrzebujemy tylko
funkcjonalności TObjectList? W TObjectList trzeba było ponadpisywać
wszystkie metody z Pointer. TObjectList, nadal tak jak TList, jest
taką generyczną listą ogólnego zastosowania?
Post by TygrysMożna też upublicznić tylko potrzebne właściwości i metody i
trochę je dostosować do rodzaju składowanych obiektów.
TMyClass = class(TObject)
private
fObjects: TObjectList;
public
property Items[Index: Integer]: TKonkretnaKlasa; default;
function Add(AObject: TKonkretnaKlasa): Integer;
// chyba lepiej mieć TKonkretnaKlasa zamiast TObject?
// względnie TKonkretnaKlasaBazowa zamiast TObject
To samo można uzystać przez dziedziczenie (zobacz TObjectList)
Niby to samo, tyle że masz dodatkowo enkapsulację jako premię.
Post by Tygrys// przy dziedziczeniu jest tu
// property List: PPointerList;
// to chyba niezbyt dobrze?
Daje bardzo szybki dostęp go obiektów z listy, to czy to dobrze
czy źle zależy od przeznaczenia klasy.
Jeszcze nigdy nie musiałem aż tak rozpaczliwie szukać szybkości
działania programu, ale nie zaprzeczam, że komuś mogło sie zdarzyć.
Tylko czy ja wiem, czy wtedy TObjectList byłby dobrym rozwiązaniem?
Post by Tygrys// property OwnsObjects: Boolean;
// też chyba często też jest tu raczej niepożądane?
Jw, zależy do czego jest klasa.
Jw ;P~ Zestaw procentowo przypadki kiedy potrzebujesz, z
przypadkami kiedy nie potrzebujesz.
Post by TygrysA kto pisze? OIDP to na BDNie było o tym obszerniej napisane w
jakichś (chyba nawet dwóch) artykułach. Z.G. na About Delphi
Programming też chyba coś o tym pisał, ale ZTCP to właśnie
powołując się na w.w artykuły.
Traktuj to jako wskazówkę, a nie jako przykazanie.
Hmm... Widziałeś mnie kiedyś w kapturze, biegającego z pochodnią po
firmach programistyczych i palącego wszystkich, którzy się
sprzeciwiają?
--
NoBy MD5: 486cf5eee849c8de7bb630e4aaa8b761