PDA

Prikaži potpunu verziju : Izvedene klase (C++)


clzola
31.5.2011, 1:24
Na primer napravim klase, cApp, cImage, cSound, cAnimitaon
i onda kod deklaracije klase cApp stavim sledece


class cImage {
// tijelo klase cImage
// ...
};

class cSound {
// tijelo klase cSound
// ...
};

class cAnimation {
// tijelo klase cAnimation
// ...
};

class cApp : public cImage, public cSound, public cAnimation {
// tijelo klase cApp
// ...
};


E sad, sa ovim cu moci preko klase cApp da pozivam i koristim (javne) clanove iz klasa cImage, cSound i cAnimation (?).
Da li je preporucljivo da se ovo radi... ili mozda ipak bolje da svaku klasu tretiram i pozivam u main posebno.

Prednosti i nedostaci ?

Belphegor
31.5.2011, 1:40
Moze da se radi ali bi po nekoj logici trebao da pogledas po definiciji sta koja klasa treba da predstavlja pa onda po tome definises njihov odnos. Po imenima koje si ovde naveo sugerise da treba drugacije da izgleda, jer cApp ne bi "trebalo da bude" vec da "poseduje":

// "has a" odnos
class cApp
{
private:
cImage img;
cSound snd;
cAnimation anm;
...
};
dok recimo ovo bi ovako trebalo:

//"is a" odnos
class Shape
{
...
};

class Circle : public Shape
{
...
};

class Triangle : public Shape
{
...
};

clzola
31.5.2011, 1:56
Moja neka ideja je da je cApp klasa koja upravlja aplikacijom dok ove ostale, upravljaju slikama, zvukom i animacijom.. Sad ja sam mislio da sve to ide preko te cApp klase pa sam zato i mislio da stavim cApp : public cImage, ....

Znaci, ti kazes da je bolje da ih stavim unutar cApp klase??

Geomaster
31.5.2011, 1:57
Nisam 100% siguran zato što ne znam šta te klase rade, ali mislim da bi cImage, cSound, cAnimation i druge trebao da staviš kao članice, a ne kao roditelje klase cApp. Izbegavaj da jedna klasa nasleđuje više drugih, iako je moguće smatra se lošom praksom zbog toga što se po definiciji kosi sa nekim principima OOP-a, mada je u nekim situacijama korektno. Glavno pravilo koje će ti pomoći je - koristi nasleđivanje kada se klasa 'nadovezuje' na neku drugu klasu tj. ona je podvrsta te klase. U suprotnom, koristi članice. A ako imaš potrebu da moraš da koristiš višestruko nasleđivanje, nije loša ideja da restruktuiraš kôd tako da ti to ne treba - ali postoje mnogi APIji koji to koriste, na primer kada jedna klasa treba da overriduje metode više apstraktnih klasa, recimo MainEventHandler može da nasleđuje apstraktne klase MouseEventHandler, KeyboardEventHandler itd. kako bi handlovao sve te evente (ovo je samo neki primer :))

EDIT: Sad sam video drugi odgovor. Prvo, možda bi bila bolja ideja da klase nazoveš cImageManager, cSoundManager, čisto zbog preglednosti :D I da, bolja bi ideja bila da ih staviš kao članice, pošto se cApp nikako ne nadovezuje na cImage ili cSound, ona bi trebalo da ih sve povezuje između sebe :)

Mada, sad to može da potegne i druga pitanja, da li je klasi koja upravlja aplikacijom potrebno da zna i koristi metode klasa koje upravljaju zvukom, animacijom itd.? Jedna od načela OOP-a je da svaka jedinica tj. klasa zna samo onoliko koliko je njoj potrebno, kako bi bila što nezavisnija. Tako da bi možda cApp upravljala samo aplikacijom, bez znanja o ostalim klasama, dok bi korisnik potezao cImage ili cSound kako bi radile nešto drugo :)