IT rekvalifikace s garancí práce. Seniorní programátoři vydělávají až 160 000 Kč/měsíc a rekvalifikace je prvním krokem. Zjisti, jak na to!
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.
Avatar

Člen
Avatar
:29.7.2015 10:37

Mám třídu Lokace

class Lokace
    {
        string jmeno;
        Lokace sever;
        Lokace jih;
        Lokace vychod;
        Lokace zapad;

        public Lokace(string jmeno)
        {
            this.jmeno = jmeno;
        }

        public void PriradSmery(Lokace sever, Lokace jih, Lokace vychod, Lokace zapad)
        {
            this.sever = sever;
            this.jih = jih;
            this.vychod = vychod;
            this.zapad = zapad;
        }

        Lokace uvodniLokace = new Lokace("Úvodní lokace");
        Lokace arvika = new Lokace("Arvika"); //1
        Lokace falun = new Lokace("Falun"); //2
        Lokace halmstad = new Lokace("Halmstad"); //3
        Lokace hassleholm = new Lokace("Hassleholm"); //4
        Lokace eksjo = new Lokace("Eksjo"); //5
        Lokace katrineholm = new Lokace("Katrineholm"); //6
        Lokace norrkoping = new Lokace("Norrkoping"); //7
        Lokace skanor = new Lokace("Skanor med Falsterbo"); //8

    }

V té samé třídě jsem si udělal i jednotlivé lokace a chtěl jsem jim přiřadit i okolní lokace (opět ve třídě Lokace, aby v tom byl trochu pořádek).
Nicméně, pokud začnu psát například "uvodni", tak VS mi nenabídne tu první lokaci. Jakoby ji neexistovala. Abych to tedy mohl dokončit, musím udělat nějakou metodu (např "PrirazeniSmeru()") a v té už ten objekt volat můžu.
Nevíte, proč to tak je? Prošel jsem si všechny předchozí tutoriály o OOP, hledat jsem i na anglických fórech, ale nic jsem nenašel.
Předem díky moc :)

 
Odpovědět
29.7.2015 10:37
Avatar
Odpovídá na
Petr Štechmüller:29.7.2015 10:50

Ty tvoje proměnný (uvodniLokace, arvika, falun...) jsou přístupné pouze po vytvoření nové instance Lokace, tzn, že pro přístup si musíš vytvořit novou instanci lokace a z ní přistoupíš k těm ostatním.

Lokace lokace = new Lokace("Jmeno");
// Ted to bude fungovat.
lokace.uvodniLokace...

Předpokládám, že tohle jsi ale udělat nechtěl. Ty chceš, aby jsi měl ty lokace přístupné staticky, tedy musíš napsat neco jako:

const Lokace uvodniLokace = new Lokace("Úvodní lokace");

pak by jsi se měl na instanci uvodniLokace dostat pomocí:

Lokace.uvodniLokace

Snad jsem Ti pomohl.

Nahoru Odpovědět
29.7.2015 10:50
Pokud spolu kód a komentář nekorespondují, budou patrně oba chybné
Avatar

Člen
Avatar
Odpovídá na Petr Štechmüller
:29.7.2015 11:02

Bohužel, zkoušel jsem oba způsoby a ani jeden nefungoval. Ten první je podle mě úplně to samé, co mi už předtím nefungovalo. A při tom druhém postupu mi VS sám nabídne třídu Lokace, ale dál už nic

 
Nahoru Odpovědět
29.7.2015 11:02
Avatar
Odpovídá na
Petr Štechmüller:29.7.2015 11:37

Tak bych se chtěl opravit před to const dej ještě public:

public const Lokace uvodniLokace = new Lokace("Úvodní lokace");

Teď by to už melo fungovat.

Nahoru Odpovědět
29.7.2015 11:37
Pokud spolu kód a komentář nekorespondují, budou patrně oba chybné
Avatar
Mediel
Tvůrce
Avatar
Odpovídá na
Mediel:29.7.2015 11:39

Nejsem si jist, zda jsem dokonale pochopil řešený problém, neměl jsem moc čas jej zkoumat, ale řešení by mohlo být (jak psal Petr Š.) použití statiky. Tedy zkus udělat něco jako:

public static Lokace uvodniLokace = new Lokace("Úvodní lokace");

Pak by tato lokace měla být v pohodě volána bez instance, tedy staticky.

Nahoru Odpovědět
29.7.2015 11:39
Nechci vám ukazovat, jak dobrý jsem já ... Chci vám ukázat, jak dobrý můžete být vy ... Když uvěříte ... V sami sebe...
Avatar
vodslon
Člen
Avatar
Odpovídá na Mediel
vodslon:29.7.2015 12:15

Z toho kodu jsem zmatený, samá lokace. Nemůžeš dávat do konstruktoru takto třídu podle mě, teda já to neumím, ale myslím, že to ani nejde, protože aby si ten konstruktor vytvořil musel bys vytvořit třídu atd...Co to má dělat?

 
Nahoru Odpovědět
29.7.2015 12:15
Avatar
Mediel
Tvůrce
Avatar
Odpovídá na vodslon
Mediel:29.7.2015 12:37

Pravda, omlouvám se, přehlédl jsem tvorbu instance a jen jsem zkopíroval kus kódu s předponou static

Nahoru Odpovědět
29.7.2015 12:37
Nechci vám ukazovat, jak dobrý jsem já ... Chci vám ukázat, jak dobrý můžete být vy ... Když uvěříte ... V sami sebe...
Avatar
Mediel
Tvůrce
Avatar
Odpovídá na vodslon
Mediel:29.7.2015 12:48
public class MojeLokace
    {
        private string _nazev;
        public string Nazev
        {
            get
            {
                return this._nazev;
            }
            set
            {
                this._nazev = value;
            }
        }

        public MojeLokace(string nazev)
        {
            this.Nazev = nazev;
        }

        public static MojeLokace UvodniLokace
        {
            get
            {
                return new MojeLokace("Úvodni");
            }
        }
    }

a pracuje se s tím takto:

class Program
    {
        static void Main(string[] args)
        {
            var l = MojeLokace.UvodniLokace;
            Console.WriteLine(l.Nazev);
        }
    }

bezproblémově to vrátí název té "statické lokace"

Nahoru Odpovědět
29.7.2015 12:48
Nechci vám ukazovat, jak dobrý jsem já ... Chci vám ukázat, jak dobrý můžete být vy ... Když uvěříte ... V sami sebe...
Avatar
Andrej Farkaš:29.7.2015 13:22

Zámerne chceš aby objekt triedy Lokace mal ďalšie properties triedy Lokace, ktoré budú mať ďalšie properties triedy Lokace, ktoré budú pravdepodobne null, ale budú zmätočné?

Nahoru Odpovědět
29.7.2015 13:22
Live. Love. Learn.
Avatar
vodslon
Člen
Avatar
Odpovídá na Mediel
vodslon:30.7.2015 8:07

Tomu rozumím, že funguje, já jsem se spíše ptal na smysl toho prvního příspěvku a metody PridatSmery(která bere samé lokace). A vlastně ani tady to s tím vrat uvodní lokace mi ted nedává smysl, co vlastně v tom projektu chceš aby to dělalo?

 
Nahoru Odpovědět
30.7.2015 8:07
Avatar
Mediel
Tvůrce
Avatar
Odpovídá na vodslon
Mediel:30.7.2015 8:21

No tak to se me ptas asi spatne, koukni, kdo ten prizpevek pridaval :))

Nahoru Odpovědět
30.7.2015 8:21
Nechci vám ukazovat, jak dobrý jsem já ... Chci vám ukázat, jak dobrý můžete být vy ... Když uvěříte ... V sami sebe...
Avatar
vodslon
Člen
Avatar
Odpovídá na Mediel
vodslon:30.7.2015 8:23

aha promiň :) no ten už s náma zatím nekomunikuje, tak uvidíme s čím příjde.

 
Nahoru Odpovědět
30.7.2015 8:23
Avatar

Člen
Avatar
Odpovídá na vodslon
:30.7.2015 9:24

Nic velkého, jen bych si chtěl procvičit, co jsem se prozatím naučil. Ale pokud to bude aspoň trochu vypadat, tak bych to sem možná hodil :)

 
Nahoru Odpovědět
30.7.2015 9:24
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 13 zpráv z 13.