Registrace nového uživatele     Návod     Kluby     Archív  Lopuchu     Lopuch.cz  

Diskuze na Lopuchu,
pohlazení na duchu

Lopuch.cz

Jméno:
Heslo:
Podpora LCD:
 
Archiv klubu C, C++ [ŽP: neomezená] (kategorie Programování) moderuje Šéf Lopuchu.

Články

Jak bezpečně ukončit vlákno z DllMain
FastAllocPool - urychlení častých alokací a dealokací
Akce a zpráva jako objekt
Tuply v C++
Efektivní alokátor malých objektů a tady druhý a třetí díl
Šablony: Být vládce kvalifikátorů
Vracíme z funkce objekty
Základy komunikace mezi procesy (ve Windows)
Multiple Interface a Instance Factory
Multithreading v C++ (ve Win32)
  Nastavení klubu     Nastavení práv     Homepage     Anketa     Přítomní     Oblíbené     Lopuch     Kategorie  
autor: 
text: 
vyplnit a 
Help
   
[ 280 ] <Novější  <<<Nejnovější  Nejstarší>>>  Starší>  
king King Born to be king - ... 23.12.2005 17:47  410
souhlas (obzvlast s tim mlaceni do hlavy ;) ), ja jen nesouhlasim s tim pojmenovanim, ze C++ je OO jazyk...

jako vetsina lidi neoznaci C jako OO jazyk, prestoze se v nem da psat objektove (v cem ne?), ja neoznacim C++ jako plne OO jazyk, protoze v nem neco chybi...
bredy 23.12.2005 17:33  409
KingNení. To o čem mluvíš není o OOP ale o implementaci a ta se OOP netýká. OOP neříká nic o tom, jak má být implementované. Nepředepisuje žádné implementační postupy. Jestli tedy někdo implentuje pomocí struct je vedlejší. Pokud dokážeš v C programovat objektově přes struct, pak je to OOP. C++ jen OOP zjednodušuje, protože spoustu situací za tebe řeší na úrovni překladač.

OOP jsou jen sada pravidel, které musíš dodržet. Jak to uděláš je tvoje věc.

Já se často potýkám s problémem, že mnoho lidí pracuje v C++ ale nedá se tomu říkat OOP. Takové programy bych jim omlátil o hlavu.
king King Born to be king - ... 23.12.2005 16:33  408
bredyne, nejsem natolik naivni, nicmene myslim si, ze tenhle rozdil je docela dulezity - koneckoncu to je podobne jako rozdil mezi C a C++:
uvazujme v C struct s promennymi a ukazateli na fce a nazveme to objektem, zdedenim nazeveme novou strukturu, ktere bude obsahovat tu predchozi - vcelku trivialne muzu pristupovat k fcim a promennym a stejne nebudu tvrdit, ze C je objektove, prave ta abstrakce, kterou poskytuje C++ tam dela ten OO pristup

je alespon trochu jasne co jsem chtel rict?
bredy 23.12.2005 15:17  407
KdokolivTo jsme si špatně rozuměli :-) Nechme toho.
kdokoliv Kdokoliv Nevidím důvod dělat cokoliv bezdůvodně. - http://kkl2401.wz.cz 23.12.2005 14:50  406
Bredy [405]: Ale tak jo, ja nerikam, ze to neprinasi nejake neprijemnosti. Ale odbehls od member promennych nekam jinam (nicmene je to jedno).
bredy 23.12.2005 14:38  405
KdokolivJá se taky nehádám. Klasickou schizofremii v Javě je třídat Thread. Mohu jí dědit přímo, nebo mohu dědit přes rozhraní Runnable. A to je případ toho delegáta. Pokud píši nějakou třídu která něci dědí, a zároveň jí chci udělat spustitelnou (Runnable), musím použít rozhraní. Řídit tuto třídu musím přes nějakou jinou instanci Thread. V C++ mohu Thread zdědit jako další rodič třídy a řídit třídu přímo, jako by sama byla threadem.

Ono to zas tak nevadí, dokud nepotřebuješ tu třídu předávat spolu s instanci Thread. Pak všude předáváš dva parametry, nebo si to musíš zabalit do nějaké další třídy. A nebo, instanci Thread vytvoříš přímo v tvé třídě a uděláš wrapper (uděláš kopie všech řídících funkcí do tvé třídy a ty směruješ na tu instanci)

class MyThread extends XXXX implements Runnable
{
  Thread _control;
  public void start() {_control.start(this);}
  ...
}

V C++
class MyThread: public XXXX, public Thread
{
public:
   .....
}
kdokoliv Kdokoliv Nevidím důvod dělat cokoliv bezdůvodně. - http://kkl2401.wz.cz 23.12.2005 13:53  404
Bredy [403]: Ale k cemu potrebuje ty member promenne? Pristupuje k nim jinak, nez pomoci set a get metod? Pokud je odpoved ano, tak je to dle filosofie Javy chyba. Pokud je odpoved ne, tak muzes mit interface.
Ja tu Javu nehajim, ani nehanim C++, ja jenom vysvetluju, jak je to v Jave mysleny.
bredy 23.12.2005 13:39  403
King No ST jej bude vytvářet implicitně. Jaký je v tom rozdíl? Nebo jsi tak najivní, že si myslíš, že ST to má uvnitř nějak vyčarovaný, že to funguje? Schválně někde v manuálnu ST najdi, jak skutečně pracuje přetypování a co to vlastně znamená.

Kdokoliv O properties nemluvim. Metody Get a Set jsou jasné. Vícenásobná dědičnost v Jave se musí dělat přes delegáty a to je to co mi občas způsobuje křeče. Místo abych si každou třídu zdědil a přizpůsobil, musím ke každé třídě mít rozhraní a to si zdědit a instanci té třídy pak vytvořit ve zděděné třídě a tvářit se jako delegát té třídy, co implementuje její rozhraní. Je to takové drbání přes hlavu. Schválně ti ukážu hlavičku jedné mé třídy.
class Application : public CWinApp, 
                    public LS::IConfiguration, 
                    public DocumentBase<LS::IMainDocument>,
                    public LS::IMainDocumentInfo

To co začíná na I je Interface. Jak bych ovšem dědil z DocumentBase, což je instance template (což by v Jave byla obyčejná třída), která připojuje Document-View systém netuším. Tato třída totiž obsahuje spoustu member proměnných, které vyžaduje ke svému běhu,
king King Born to be king - ... 23.12.2005 13:29  402
bredyano, ted kdyz si to prepsal na jeden radek, tak je to uplne o necem jinem... ;) -- ne, stale si myslim, ze je to neco uplne jineho nez u toho ST, stale explicitne vytvaris novy objekt...

jinak to, ze C++ je paskvil si mi nevymluvil, ale to je muj osobn nazor...
kdokoliv Kdokoliv Nevidím důvod dělat cokoliv bezdůvodně. - http://kkl2401.wz.cz 23.12.2005 11:56  401
Bredy [400]: No to se imho dostavame k nasemu predchozimu sporu oheldne properties. :-) Ty v Jave nejsou, tudiz mas mit na tom rozhrani get a set metody, ktere si pak pochopitelne musis v kazde tride implementovat, at uz za pouziti member promenne (nejspis) nebo jakkoliv jinak. Tak byla ta Java holt navrzena, samozrejme se Ti to muze nelibit.
bredy 23.12.2005 11:07  400
KdokolivVím. Akorát rozhraní nesmí mít member proměnné. Což někdy v C++ docela dost využívám. Jave pak musím tu member proměnnou dát do každé třídy, která rozhraní implementuje, což je trošku neobjektové (zhatím tím to "re-use").
kdokoliv Kdokoliv Nevidím důvod dělat cokoliv bezdůvodně. - http://kkl2401.wz.cz 23.12.2005 11:02  399
Ono v Jave typicky vicenasobnou dedicnost nepotrebujes, neb se takove veci resi implementaci vice rozhrani.
bredy 23.12.2005 09:25  398
A ještě jedna poznámka: Když jsem se na FELu učil předmět Objektové programování, učil jsem se SmallTalk. Když jsem o několik let později měl na UHK objektové modelování, učili mne UML. Tam jsem teprve pochopil. že OOP není Smalltalk, ale ve skutečnosti se jedná jen o sadu doporučení a nějaké metodiky, jak programovat objektove a využit jednu nejhlavnější vlastnostr OOP a to je možnost "re-use".
bredy 23.12.2005 09:20  397
KingCo když to přepíšu takto?
MyString a="AABBAEDAE"; //MyString - moje verze řetězce
int uniqsize=MySet(a).Size(); //MySet - moje verze množiny.


Kde bereš jistotu, že Smalltalk přetypováním ve skutečnosti neprovede převod objektu řetězec na objekt množina, které pak pošle zprávu o získání velikosti

Ano máš pravdu v tom, že Smalltalk umožňuje zasílání zpráv i neznámým objektům. Umožňuje prostě zaslat zprávu komukoliv, aniž bych musel definovat nějaké společné rozhraní jako je to u C++ nebo u Javy. V C++ vlastně institut neznámého objektu neexistuje, minimálně o něm musím vědět, že umí nějaké rozhraní, přes které bych se s ním domluvil. Opět ale jsem neviděl nikde v OOP (v UML) nic o tom, že by to měl OOP jazyk umět, v UML se neříka nic o tom, co se například stane, když pošlu zprávu objektu, který ji neumí zpracovat. Zrovna tak se nikde neříka, zda rozhraní objektu musí být v místě použití známo. V C++ a v Javě musí. Ve Smalltalku nemusí.

Abych flame uzavřel. Dokonce si myslím že Smalltalk je jazyk, ktery podle mne vznikl proto, aby implementoval všechny finesy, které OOP nabízí. Nebudu se tedy hádat, co je z pohledu OOP lepší, jestli C++, nebo Smalltalk, protože Smalltalk to vyhraje. Programátor za to ale většinou docela draze zaplatí (většinou výkonem - Smalltalk zrovna žádné dělo není). Co se C++ týče, pokud bych hodnotil úroveň implementace OOP, řekl bych že v C++ je na velmi dobré úrovni (rozhodně to není paskvil, jak tady někdo říkal). Spoustu dalších současných jazyků implementuje OOP podobně, umí něco navíc (V Jave lze přepsat kteroukoliv metodu), něco zase neumí (V Jave například chybí vícenásobná dědičnost, což je dost zásadní vada dle mého názoru).

Závěr: C++ je objektový jazyk
bredy 23.12.2005 08:53  396
huhPřečti si to znovu. Já to pochopil, je to přesně tak jak píšeš. Jen jsem kritizoval nějaké názory (co jsem zaslechl někde jinde), že v "pravém OOP" se "doopravdy" zasílají zprávy - což je opět blud, protože OOP nic o tom, jakým způsobem jsou zprávy zasílány nic neříka.

[ 280 ] <Novější  <<<Nejnovější  Nejstarší>>>  Starší>  

(c) 2001-2011 Lopuch.cz   
Kontakt