🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Article View: pl.comp.lang.delphi
Article #334824

Re: E2032 For loop control variable must have ordinal type

#334824
From: wloochacz
Date: Mon, 16 Jan 2012 22:57
55 lines
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-mail
References: <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