Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

Visestruko nasljedjivanje - polimorfizam

[es] :: C/C++ programiranje :: Visestruko nasljedjivanje - polimorfizam

[ Pregleda: 2034 | Odgovora: 3 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

azzpoz

Član broj: 300637
Poruke: 96



+1 Profil

icon Visestruko nasljedjivanje - polimorfizam25.12.2013. u 16:30 - pre 74 meseci
Nedoumica je sljedeća:

Code:

class Osoba{...}
class Ratnik: virtual protected Osoba 
class Obicni: virtual public Osoba

class Specijalac: public Ratnik, public Obicni


Zašto mi ne radi polimorfizam oblika:

Ratnik ratn;
Specijalac spec;


Osoba *pokaziva = &ratn;    // da li znaci da ne mozemo primjenjivati polimorfizam na protected i private nasljeđivanja

Radi sa: 
Osoba *pokazivac = &spec;
// Zasto bi ovako radilo, a klasa Specijalac je derivirana od Ratnik koja je protected



 
Odgovor na temu

glorius
Damir Nikolic
C++ developer
SR

Član broj: 4366
Poruke: 428
*.dynamic.isp.telekom.rs.

ICQ: 208550327


+14 Profil

icon Re: Visestruko nasljedjivanje - polimorfizam27.12.2013. u 21:06 - pre 74 meseci
Vrlo interesantno pitanje. Odgovor koji cu pokusati da ti dam je samo radi davanja ideje posto nisam siguran da li sam u pravu posto ovakvu implementaciju jos nisam video a kamoli koristio:)

Modifieri pristupa, kada se koriste u kontekstu nasledjivanja, menjaju access ka spoljasnjem svetu, analogno modifierima pri definisanju clanica klase.

Tako da je moguce da, kada si naknadno primenio public pristup prilikom deklarisanja 'class Specijalac: public Ratnik, public Obicni' promenio pristup iz protected u public.

Sto se tice ovoga:

Code:


Osoba *pokaziva = &ratn;



Protected pristupom si ucinio operator 'address of (&)' protected tako da ti kompajler javlja gresku oko pristupa tom operatoru, koji je, cini mi se, implicitno implementiran (analogno default konstruktorima i assignment operatoru).

Ako ubacis ovaj kod u Ratnik klasu, kompajlirace se:

Code:


public:
    Osoba* operator&()
    {
        return this;
    }



Moj savet je da izbegnes multiple inheritance kada god mozes i da koristis kompoziciju kada dodje do situacija da moras da koristis mult. inh. osim ako bazne klase nemaju ulogu interfejsa. Naravno, ni kompozicija nije silver bullet ali je, bar po meni, bolji dizajn jer je lakse raditi na taj nacin.

Code:


class Specijalac : public Ratnik
{
     Obicni* m_pObicni;
public:
     // funkcije od interesa iz Ratnika koristis ili overrideujes a funkcije iz m_pObicni delegiras 
};


EOF
 
Odgovor na temu

azzpoz

Član broj: 300637
Poruke: 96



+1 Profil

icon Re: Visestruko nasljedjivanje - polimorfizam29.12.2013. u 21:54 - pre 74 meseci
Koje bi bile još ideje, kako bih izbjegao kompoziciju i višestruko nasljeđivanje, a da pri tome "ne gubim dizajn i jednostvanost kojoj težim"
 
Odgovor na temu

glorius
Damir Nikolic
C++ developer
SR

Član broj: 4366
Poruke: 428
*.dynamic.isp.telekom.rs.

ICQ: 208550327


+14 Profil

icon Re: Visestruko nasljedjivanje - polimorfizam29.12.2013. u 22:50 - pre 74 meseci
Ja bih to, mozda, ovako uradio:

class Osoba
{};

class Obicni : public Osoba
{}

class Ratnik : public Osoba
{}

class Specijalac : public Ratnik
{}

Moguce da ce ti se ponavljai kod iz klase Obicni u klasi Specijalac ali ovako cinis dizajn jednostavnijim.
Jedna od mogucnosti je da pomeris funkcionalnost iz Obicni u Osoba pa da reuse neke od funkcija u Specijalac (sa druge strane, ovim se rizikuje da Osoba sadrzi funkcije koje ne bi trebale da budu u toj klasi).

Ja bih ti savetovao da pogledas malo Design Patterns ako vec nisi. Odlicni su za resavanje ovakvih problema. Npr. Strategy design pattern ti omogucava da enkapsuliras funkcionalnost ili ti ponasanje u objektu.
I opet, da tu koristis kompoziciju umesto nasledjivanja i da zadrzis hijerarhiju kako sam ti napisao.

Code:


class AIStrategy
{
public:
     virtual void update() = 0;
};

class AIStrategyRatnik
{
public:
     virtual void update()
     { ... }
};

class AIStrategySpecijalac
{
public:
     virtual void update()
     { ... }
};

----------

class Osoba
{
     AIStrategy* m_pStrategy;
public:
     virtual void update()
     {
            if(m_pStrategy)
           {
                 m_pStartegy->update();
           } 
           else
           {
                 // defaultno ponasanje
           }

           // NOTE:  mozes i da overrideujes Osoba::update() tako da imas skroz drugaciju funkcionalnost u izvedenim klasama 
     }
};

class Ratnik : public Osoba 
{
 public:
       Ratnik()
       {   
             m_pStrategy = new AIStrategyRatnik;
       }
}



Ko sto vidis, dizajniranje nije ni malo lako u smislu da se nadje pravo resenje u ranoj fazi. Moras malo i da eksperimentises sa prototipovima aplikacije kako bi napravio bolji dizajn.
EOF
 
Odgovor na temu

[es] :: C/C++ programiranje :: Visestruko nasljedjivanje - polimorfizam

[ Pregleda: 2034 | Odgovora: 3 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.