Article View: pl.comp.lang.delphi
Article #334824Re: E2032 For loop control variable must have ordinal type
From: wloochacz
Date: Mon, 16 Jan 2012 22:57
Date: Mon, 16 Jan 2012 22:57
55 lines
3349 bytes
3349 bytes
W dniu 2012-01-16 23:17, jh pisze:
> Jak zrobić, żeby dziedziczące klasy umiały korzystać z funkcji klasowej
> CreateList i żeby ona zwracała obiekt właściwej klasy? Zgodnie z
> powyższym kodem oczywiście to nie zadziała:
>
> var
> sl: TSingleList;
>
> sl := TSingleList.CreateList('Single List', -1);
A tak:
sl := TSingleList.(TSingleList.CreateList('Single List', -1));
I dlaczego się kompiluje?
No więc właśnie...
> A jeszcze lepiej, żeby (wiem, że to niepoprawny zapis, chodzi mi o
> uzyskanie takiej funkcjonalności) było tak:
>
> var
> cl: TCustomList<T>;
>
> cl := TCustomList.CreateList('Single List', -1); (zwraca obiekt klasy
> TSingleList lub TMultiList - a decyduje o tym funkcja klasowa CreateList
> zależnie np. od otrzymanych parametrów. Da się tak?
Da się, ale na pewno nie w ten sposób...
Nie wiem dlaczego, ale próbujesz na siłę wykorzystać typy generyczne aby
robiły za polimorfizm.
Po co tak?
To co chcesz uzyskać, to się da i robi, tyle że bez typów generycznych
za to z typami klasowymi.
Zerknij np. na to:
http://docwiki.embarcadero.com/Libraries/en/Vcl.ComCtrls.TCustomTreeView.OnCreateNodeClass
Jak widzisz w tym zdarzeniu możesz do TTreeView przekazać dowolną klasę
(która dziedziczy z TTreeNode) aby Node (liść, węzeł), który zostanie
utworzony był instancją klasy którą przekażesz w tym zdarzeniu.
Podobnie Ty, możesz zrealizować to tak, aby podać typ klasy w
parametrze. I żadne generyki do tego nie potrzebne...
IMHO, wybrałeś zły przykład do nauki generyków...
Generalnie klasa, która używa typu generycznego (ogólnego), nie powinna
się nim w ogóle przejmować (czyli typem obiektu, który przechowuje) ani
tym bardziej w żaden sposób od niego zależeć.
Dlatego to świetne rozwiązanie do wszelkiej maści kontenerów na dane
(listy, stosy, kolejki, drzewa, itd.).
Spójrz jak rozwiązano np. sortowanie w TList<T> (aczkolwiek to nieco
zakręcony przykład) ale co ważniejsze, dlaczego sam algorytm sortowania
został oddelegowany na zewnątrz i nie jest w żaden sposób
zaimplementowany w TList<T>?
Jakbyś zaimplementował sortowanie elementów listy dla ogólnego typu
(czyli <T>), bo przecież na pewni nie wewnątrz klasy TList<T>, prawda?
--
wloochacz
Technical Details
Message-ID:
<jf2a0j$qcl$1@inews.gazeta.pl>Path:
mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!news.gazeta.pl!not-for-mailReferences:
<jf1eso$r2g$1@inews.gazeta.pl> <jf1hvq$6dj$1@inews.gazeta.pl> <15e8um5ehdue7.dlg@hell.heaven> <jf27m9$is9$1@inews.gazeta.pl>Show Full Headers
Complete Article Headers
Path: mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!news.gazeta.pl!not-for-mail From: wloochacz <wloochacz@nospam.gmail.spameromnie.com> Newsgroups: pl.comp.lang.delphi Subject: Re: E2032 For loop control variable must have ordinal type Date: Mon, 16 Jan 2012 23:57:15 +0100 Organization: "Portal Gazeta.pl -> http://www.gazeta.pl" Lines: 55 Message-ID: <jf2a0j$qcl$1@inews.gazeta.pl> References: <jf1eso$r2g$1@inews.gazeta.pl> <jf1hvq$6dj$1@inews.gazeta.pl> <15e8um5ehdue7.dlg@hell.heaven> <jf27m9$is9$1@inews.gazeta.pl> Reply-To: wloochacz@nospam.gmail.spameromnie.com NNTP-Posting-Host: 178.217.32.151 Mime-Version: 1.0 X-Trace: inews.gazeta.pl 1326754643 27029 178.217.32.151 (16 Jan 2012 22:57:23 GMT) X-Complaints-To: usenet@agora.pl NNTP-Posting-Date: Mon, 16 Jan 2012 22:57:23 +0000 (UTC) X-User: wloochacz User-Agent: Mozilla/5.0 (Windows NT 6.1; rv:8.0) Gecko/20111105 Thunderbird/8.0 In-Reply-To: <jf27m9$is9$1@inews.gazeta.pl> Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit