none
Pole instancí

    Dotaz

  • Dobý večer,

      potrěboval bych vytvořit pole a každé pole naplnit instancí z jiné třídy, ale se stejným předkem.

    raději uvedu příklad:


     

    class Zivocich
        {
        int stari;
        public Zivocich() {  stari = 10;}
        }
    
    class Krava: Zivocich
        {
            private int mleko;
            
            public Krava() { mleko = 20; }
    
            public int Podoj() { //telo }
        }
    
    class Slepice: Zivocich
        {
            private int vejce;
            
            public Slepice() {vejce = 20; }
    
            public int SeberVejce() { //telo }
        }
    
    class Hlavni
        {
            Zivocich[] zvirata = new Zivocich[10];
            zvirata[0] = new Krava();
            zvirata[1] = new Slepice();
     
            zvirata[0].Podoj();  //Tady to jiz nejde
            zvirata[1].SeberVejce(); //Take ne
         }
      
    
    
    
    
    
    
    


    Když se to veme reálně, tak potřebuju vytvořit chlívky pro n zvířat a pak do jednotlivých chlívků dát bud krávy a nebo slepice.

    Snad bude popis srozumitelný a doufám, že to něják pude. Předem děkuji za odpověď.

     

     

     


    • Upravený nitrammen čtvrtek 12. ledna 2012 22:06
    čtvrtek 12. ledna 2012 22:05

Odpovědi

  • Proč tam máte tu funkci KdoJsi?


    Vždyť stačí

    if (zvirata[0] is Krava) {
        var k = (Krava)zvirata[0]; // přetypovat
        k.Podoj();
    }
    

    Bude to fungovat i pokud by ve zvirata[0] byl objekt, který dědí z Krava - ten bude mít metodu Podoj taky.


    Best regards Tomáš Herceg | ASP.NET MVP (http://www.vbnet.cz) Chief Software Architect @ http://www.riganti.cz
    sobota 14. ledna 2012 14:13
    Přispěvatel

Všechny reakce

  • Abych použil tvou terminologii, tak můžeš dát do chlívku které zvíře chceš, ale nemůžeš s každým zvířetem dělat co se ti zlíbí. Například nemůžeš podojit slepici.

     

    Proto buď musíš udělat funkce pro všechny potomky stejné ikdyby ve většině potomků NIC nedělali (bude existovat funkce podoj() pro všechny zvířata, nebo budeš muset nejprve zjistit co je ve chlívku za zvíře a podle toho co tam je použít funkci (přetypovat zvíře na krávu a teprve potom ji podojit).

     

    Je to normální vlastnost dědičnosti. Musíš se s ní nějak normálně vypořádat tak jako všichni ostatní.

     

    Napsal jsem to srozumitelně?


    JCH
    pátek 13. ledna 2012 6:57
  • Děkuji za odopvěď.

    Toto mi je celkem jasné, že pokuď si v třídě slepice nenadefinuji metodu podoj, že ji potom nemohu použít. De mi o to, jestli moho založit pole jako Zivocich př.  Zivocich[] zvirata = new Zivocich[5];  a poté přetipovat určitý prvek pole, vlastně předka na potomka, na konkrétní druh třeba krávu. To znamená jak napsat, aby v určitém chlívku byla opravdu kráva a ja ji mohl po zjištění, že to není nic jiného podojit.

    Abych později mohl pśat něco takového:

    if (zvirata[0] is Krava)
      {
          zvirata[0].Podoj();                         
      }
    else if (zvirata[0] is Slepice)
      {
          zvirata[0].SeberVejce();                
      }
    else
      {
          //neni to ani jedno
      }
    

    Rád bych zjistil jestli to lze provést podobně jak jsem zde naznačil a nebo jestli se to musí řešit úplně odlišně. Ve výsledku by mělo vzniknout pole s kterým by se dalo pracovat pomocí cyklů, bylo by možné přidávat a rušit jednotlivé buňky, zjišťovat co jaká buňka obsahuje jistli např. kravu nebo slepici, atd.

     

    pátek 13. ledna 2012 10:29
  • Dobrý den,

     

    ano něco takového opravdu musíte napsat. Problémem je že pokud vím nic takového hotového v syntaxi jazyka není. Musíte to udělat sám programově.

     

    Takže v definici Zivocich musíte mít nějakou funkci která vám bude vracet typ zivocicha (například KdoJsi() vrátí zatím řádný živočich=0) a v potomcích ji překrýt (například v potomku Kráva KdoJsi() vrátí Kráva = 1). Jde to určitě udělat lépe než číslicemi (například výčtem hodnot).


    JCH
    pátek 13. ledna 2012 10:41
  • Toto mi pomůže zjistit jakou používám v určitém prvku pole třídu jestli kráva a nebo něco jiného.

    Můj hlavní problém, ale spočívá hlavně v tom, že nejsem schopen (neznám syntaxe) změnit typ prvku pole z Zivocicha na jeho potomka např. Kravu a poté moci s tímto prvkem provádět metody, které jsou nadefinovány až v třídě Krava. Po mích pokusech o přetipování prvku  ze Zvirete na Kravu jsem mohl používat pouze metody definované v třídě Zvire a z toho soudím, že se mi přetipování nepovedlo.

    Když to řeknu zas jakoby realně, tak dokažu vytvořit n chlívků připravených pro zvířata (mohu je krmit, zabit prostě to co si nadefinuju v tridě zvire), ale nedokážu změnit popis chlívku (jednoho) ze zvířete na krávu (upřesnit použití chlívku to znamená přetipovat ze Zvirete na Kravu), abych mohl využívat pro tento jeden chlívek i metody z třídy Zvire, ale i z třídy Krava.(Krava je potomek Zvirete)

    Tudíž potřeboval bych poradit jak přetipovat konkrétní pole (vložit do něj třeba krávu), abych pro něj mohl využívat metody jak z třídy Zvíře tak i z jeho potomka to znamená z třídy Krava (v jiném prvku tohoto pole jiné zvíře).  Popřípadě odkázat mě na nějaké studíjní materiály nebo program s něčím podobným. Pole vytvářím proto abych měl možnost dát do každého chlívku jiné zvíře. Ovšem nevím jestli nejdu slepou uličkou a jestli to takto de.

    Děkuji vám za vaší trpělivost.

    pátek 13. ledna 2012 11:40
  • Ted u sebe nemám vývojové prostředí.

    Zkusím večer napsat nějaký funkční kód.

     

    Ale tak to zkuste blbuvzdorně. Toto funguje?

     

    if (KdoJsi(zvirata[0]) == tKrava)
      {
          Krava k = (Krava)(zvirata[0]);
           
          k.Podoj();                         
      }
    else if (KdoJsi(zvirata[0]) == tSlepice)
      {
          Slepice s = (Slepice)(zvirata[0]);
    
          s.SeberVejce();                
      }
    else .....
    



    JCH
    pátek 13. ledna 2012 12:43
  • Děkuji za "nakopnutí" tento kód funguje a díky němu mě napadlo poměrné elegantní řešení mého problému.

    Ještě jednou děkuji za vaší ochotu a čas.

    pátek 13. ledna 2012 13:13
  • Proč tam máte tu funkci KdoJsi?


    Vždyť stačí

    if (zvirata[0] is Krava) {
        var k = (Krava)zvirata[0]; // přetypovat
        k.Podoj();
    }
    

    Bude to fungovat i pokud by ve zvirata[0] byl objekt, který dědí z Krava - ten bude mít metodu Podoj taky.


    Best regards Tomáš Herceg | ASP.NET MVP (http://www.vbnet.cz) Chief Software Architect @ http://www.riganti.cz
    sobota 14. ledna 2012 14:13
    Přispěvatel