NOVINKA - Online rekvalifikační kurz Java programátor. Oblíbená a studenty ověřená rekvalifikace - nyní i online.
NOVINKA – Víkendový online kurz Software tester, který tě posune dál. Zjisti, jak na to!
Avatar
Jarda Pácha
Člen
Avatar
Jarda Pácha:28.1.2017 21:50

Čau všem,

postupně procházím tutoriály OOP a narážím zde na problém a potřeboval bych poradit.
"":http://www.itnetwork.cz/…riklady-oop/
Na výše uvedené adrese se nachází třetí řešení, ze kterého nejsem moc moudrý. V předešlé lekci bylo krásně popsané, jak vytvořit třídu, v ní metodu s parametry, dále atributy a následně jak vytvořit novou instanci. To všechno jsem pochopil, ale pořád nerozumím tomu třetímu řešení, kde se dva kamarádi pozdraví a představí.

Ve třídě Clovek je tento kód:

public Clovek kamarad;

V metodě PredstavSe je uvedene jako parametr:

kamarad.jmeno

A v Program.cs je kamarádství napsáno takto:

josef.kamarad = karel;

Co znamená, když napíšu public Clovek kamarad, ale bez toho klíčového slova new? A proč tento kód píšu ve třídě Clovek? Co jsem tak koukal, bude to asi nejspíš nějaká reference, ale moc tomu řešení nerozumím. Mohl by mi to někdo vysvětlit, prosím? Co jakým příkazem přesně definuji? Moc děkuji a hezký večer. : )

Odpovědět
28.1.2017 21:50
Všechno co se děje, je výsledkem našich myšlenek.
Avatar
Petr Šťastný
Tvůrce
Avatar
Odpovídá na Jarda Pácha
Petr Šťastný:28.1.2017 22:11
public Clovek kamarad;

je to samý, jako dejme tomu public string jmeno. Je to proměnná. To 'Clovek' je něco, jako třeba string nebo int.

-

Proměnná kamarad je reference na jiného člověka. Reference je odkaz. Můžeš si to představit jako ve Windows zástupce, co odkazuje na nějaký jiný soubor. Tohle odkazuje na člověka. Hezky si to můžeš představit na tomto kódu:

{
            Clovek petr = new Clovek("Petr", null);
            Clovek jirka = new Clovek("Jirka", petr);
            Console.WriteLine(jirka.kamarad.name);
            petr.name = "Ondra";
            Console.WriteLine(jirka.kamarad.name);

            Console.ReadKey();
        }

        class Clovek
        {
            public string name;
            public Clovek kamarad;

            public Clovek(string name, Clovek kamarad)
            {
                this.name = name;
                this.kamarad = kamarad;
            }
        }

Výstup:
Petr
Ondra

Nejdřív vytvořím dva lidi: Petra bez kamaráda a Jirku s kamarádem - právě tím Petrem. Nechám vypsat jméno kamaráda Jirky - jirka.kamarad (tedy myšleno Petr) .name (tedy jméno Petra)
Pak je tam hezky vidět ta reference. Změním jméno Petra na "Ondra". Ale pořád je to ten samý člověk. Reference odkazuje na toho samého člověka, kterému se ale teď změnilo jméno. Tedy místo Petr to vypíše Ondra.

-

josef.kamarad = karel;

Tady to je už myslím jasné, do proměnné kamarad uložím referenci na Karla.

Kdyby ses na něco chtěl zeptat, nebo bys chtěl ještě něco dovysvětlit, určitě napiš :-)

Akceptované řešení
+20 Zkušeností
+2,50 Kč
Řešení problému
 
Nahoru Odpovědět
28.1.2017 22:11
Avatar
Jarda Pácha
Člen
Avatar
Jarda Pácha:29.1.2017 11:49

Zkusil jsem vytvořit na ukázku program, koukni na to prosím:
Clovek.cs:

   class Clovek
   {
       public Clovek kamarad;
       public Clovek vztah;
       public Clovek nepritel;
       private string jmeno;
       private string prijmeni;
       private int vek;

       public Clovek(string jmeno, string prijmeni, int vek)
       {
           this.jmeno = jmeno;
           this.prijmeni = prijmeni;
           this.vek = vek;
       }

       /// <summary>
       /// Vrátí textovou reprezentaci instance člověka
       /// </summary>
       /// <returns>Informace o osobě</returns>
       public override string ToString()
       {
           return string.Format("INFORMACE O OSOBĚ\nJméno: {0}\nPříjmení: {1}\nVěk: {2}\nKamarád: {3}\nVe vztahu s {4}\n Nepřítel: {5}"
               , jmeno, prijmeni, vek, kamarad.jmeno, vztah.jmeno, nepritel.jmeno);
       }
}

Program.cs:

Clovek jarda = new Clovek("Jaroslav", "Novák", 22);
            Clovek alenka = new Clovek("Alena", "Literová", 41);
            Clovek lucie = new Clovek("Lucie", "Firešová", 18);
            Clovek radka = new Clovek("Radka", "Milerádová", 18);
            Clovek kuba = new Clovek("Jakub", "Kapr", 22);

            jarda.kamarad = jarda;
            jarda.vztah = jarda;
            jarda.nepritel = jarda;

            alenka.kamarad = lucie;
            alenka.vztah = jarda;
            alenka.nepritel = radka;

            Console.WriteLine(jarda);
            Console.WriteLine();
            Console.WriteLine(alenka);

            Console.ReadKey();

Chápu ty reference správně? Jinak díky za vyčerpávající odpověď. :D

Nahoru Odpovědět
29.1.2017 11:49
Všechno co se děje, je výsledkem našich myšlenek.
Avatar
Petr Šťastný
Tvůrce
Avatar
Odpovídá na Jarda Pácha
Petr Šťastný:29.1.2017 13:20

Přesně tak, chápeš to správně. Je prostě jenom důležité si uvědomit, že reference je odkaz na objekt, že to není objekt jako takový :-)

A vůbec nemáš zač, jsem rád, že jsem pomohl.

Editováno 29.1.2017 13:20
 
Nahoru Odpovědět
29.1.2017 13:20
Avatar
Jarda Pácha
Člen
Avatar
Jarda Pácha:29.1.2017 13:36

Super, moc díky:)

Nahoru Odpovědět
29.1.2017 13:36
Všechno co se děje, je výsledkem našich myšlenek.
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 5 zpráv z 5.