Diskuze: Objekty

C# .NET .NET (C# a Visual Basic) Objekty American English version English version

Avatar
Jiří Janeček (Johnny):

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 Jiří Janeček (Johnny)
Petr Štechmüller:

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
Odpovídá na Petr Štechmüller
Jiří Janeček (Johnny):

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 Jiří Janeček (Johnny)
Petr Štechmüller:

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  +1 29.7.2015 11:37
Pokud spolu kód a komentář nekorespondují, budou patrně oba chybné
Avatar
Mediel
Redaktor
Avatar
Odpovídá na Jiří Janeček (Johnny)
Mediel:

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:

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  +1 29.7.2015 12:15
Avatar
Mediel
Redaktor
Avatar
Odpovídá na vodslon
Mediel:

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
Redaktor
Avatar
Odpovídá na vodslon
Mediel:
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š:

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:

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
Redaktor
Avatar
Odpovídá na vodslon
Mediel:

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:

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
Odpovídá na vodslon
Jiří Janeček (Johnny):

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.