[C#] Pouzitie objektu v inej triede – .NET – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu
Reklama
Reklama

[C#] Pouzitie objektu v inej triede – .NET – Fórum – Programujte.com[C#] Pouzitie objektu v inej triede – .NET – Fórum – Programujte.com

 

Hledá se programátor! Plat 1 800 € + bonusy (firma Boxmol.com)
Smokie0
Expert
23. 5. 2008   #1
-
0
-

Zdravim vsetkych.

Mam taky mensi problem. Mozno to len zbytocne komplikujem a mozno sa to da jednodussie, ale ide o to, ze neviem ako pracovat s objektom v inej triede nez v akej som ho vytvoril.

Napriklad v Main (Main.cs) si vytvorim objekt oStep so vstupnymi parametrami X a Y

Step oStep = new Step(0, 0);

Jeho trieda Step implementuje nejaky interface IStep, to je asi jedno a nachadza sa v subore IStep.cs (radsej pisem vsetko, pre istotu).

V triede Game (IGame.cs) je metoda NexStep (return ma byt objekt rozhrania IStep), ktora od uzivatelia prevezme prikaz a zmeni X a Y a vytvori novy objekt oStep triedy Step s novymi suradnicami X a Y.

A moj problem je ten, ze s tymto novym objektom oStep neviem v Main pracovat. Vzdy ked sa o nieco pokusim, tak pracuje iba so starym, ktory je vytvoreny v Main a nie tym novsim z metody NexStep triedy Game.

Hlavna myslienka je ta, ze chcem urobit pohyb medzi miestnostami. Kazda ma svoju suradnicu X a Y a v podstate tie suradnice sa ako keby snazim prenasat cez objekt oStep.

Radsej ukazem kody.

Main.cs


public static void Main()
{
int curPosX, curPosY;

Game oGame = new Game();
Player oPlayer = new Player("Smokie", 100, 0, 0);
Step oStep = new Step(0, 0); // tu je prvy oStep
Map oMap = new Map();

curPosX = oStep.getPositionX();
curPosY = oStep.getPositionY();

oMap.createRoom(curPosX, curPosY); // tu sa len vytvaraju miestnosti,
//ktore maju suradnice X a Y. Ide vlastne o pohyb medzi nimi.

oGame.NextStep("a"); // tymto vznikne novy oStep

curPosX = oStep.getPositionX(); //ale stale pracujeme s povodnym...
curPosY = oStep.getPositionY();

oMap.createRoom(curPosX, curPosY);
}


IGame.cs


class Game: IGame
{
public int newPosX;
public int newPosY;

public Game()
{
}

public IStep NextStep(string command)
{
newPosX = 0;
newPosY = 1;

Step oStep = new Step(newPosX, newPosY);
return oStep;
}
}


IStep.cs


class Step: IStep
{
int curPosX, curPosY;

public Step(int curPosX, int curPosY)
{
this.curPosX = curPosX;
this.curPosY = curPosY;
}
}

Nahlásit jako SPAM
IP: 88.212.21.–
Reklama
Reklama
23. 5. 2008   #2
-
0
-

Nevim přesně, jak vypadá třída step, ale zkus to takhle.

oStep = oGame.NextStep("a");

Nahlásit jako SPAM
IP: 84.21.124.–
Dušan Janošík | web: djanosik.cz, @djanosik
Smokie0
Expert
23. 5. 2008   #3
-
0
-

To som skusil, ale vyhodilo mi to na tom riadku chybu
Cannot implicitly convert type `TextGameInterfaces.IStep' to `TextGameInterfaces.Step'. An explicit conversion exists (are you missing a cast?)(CS0266)]

Step:



class Step: IStep
{
int curPosX, curPosY;

public Step(int curPosX, int curPosY) // konstruktor
{
this.curPosX = curPosX;
this.curPosY = curPosY;
}

public int getPositionX() // moja metoda
{
return this.curPosX;
}

public int getPositionY() // moja metoda
{
return this.curPosY;
}

public string GetRoomDescription() // metoda urcena interfaceom
{
return "";
}

public ArrayList GetItemList() // metoda urcena interfaceom
{
ArrayList ItemList = new ArrayList();

return ItemList;
}

public ArrayList GetBackPackContent() // metoda urcena interfaceom
{
ArrayList PackContent = new ArrayList();

return PackContent;
}

public ArrayList GetRoomDirections() // metoda urcena interfaceom
{
ArrayList RoomDirections = new ArrayList();

return RoomDirections;
}

public bool IsGameSolved() // metoda urcena interfaceom
{
return false;
}

public string GetError() // metoda urcena interfaceom
{
return "";
}

}

Nahlásit jako SPAM
IP: 88.212.21.–
Smokie0
Expert
23. 5. 2008   #4
-
0
-

A NexStep musi vraciat IStep objekt, tak je dane interfaceom a zmenit sa to neda...

Nahlásit jako SPAM
IP: 88.212.21.–
23. 5. 2008   #5
-
0
-

To Smokie : Tak si přečti tu chybu a chovej se podle ní. Musíš to přetypovat.

oStep = (Step)oGame.NextStep("a");

Nahlásit jako SPAM
IP: 84.21.124.–
Dušan Janošík | web: djanosik.cz, @djanosik
Smokie0
Expert
23. 5. 2008   #6
-
0
-

To mi nenapadlo. Myslel som, ze je to fatalna chyba a neda sa s tym nic robit.

Ale funguje to :) Parada, dakujem.

Nahlásit jako SPAM
IP: 88.212.21.–
23. 5. 2008   #7
-
0
-

To je tak, když lítáš bez pilotního průkazu. ;)

Nahlásit jako SPAM
IP: 84.21.124.–
Dušan Janošík | web: djanosik.cz, @djanosik
Smokie0
Expert
23. 5. 2008   #8
-
0
-

Ak mozem, mal by som este jednu otazku...

Napriklad ako mam metodu NextStep v triede Game



public IStep NextStep(string command)
{
newPosX = 0;
newPosY = 2;

Step oStep = new Step(newPosX, newPosY);
return oStep;
}


tak tu by som rad zavolal metodu GetRoomDirections(), ktora je v triede Room a jej instancie v triede Map. Ako na to? Vseobecne povedane neviem ako pracovat s metodami objektu, ktory nie je vytvoreny v triede a metode v ktorej s nim pracovat chcem. Tiez to mam pretypovat?

Nahlásit jako SPAM
IP: 88.212.21.–
Smokie0
Expert
23. 5. 2008   #9
-
0
-

djanosik napsal:
To je tak, když lítáš bez pilotního průkazu. ;)

Ja viem... Clovek dlhe roky robi v proceduralnom programovani a teraz sa musi naucit mysliet objektovo... Sice som to mal cely semester, ale velmi mi to nepomohlo. :)

Nahlásit jako SPAM
IP: 88.212.21.–
23. 5. 2008   #10
-
0
-

Nejsem si zcela jistej, jestli jsem tě správně pochopil. Můžeš např. parametrem metody NextStep předat odkaz na třídu, kde se nachází metoda GetRoomDirections.

public IStep NextStep(string command, Room room) 

{
newPosX = 0;
newPosY = 2;

Step oStep = new Step(newPosX, newPosY);
return oStep;

// např. nějak tak
room.GetRoomDirections();
}


Máš v tom docela zmatek, je těžký pochopit, co vlastně potřebuješ, ale snad jsem to trefil.

Nahlásit jako SPAM
IP: 84.21.124.–
Dušan Janošík | web: djanosik.cz, @djanosik
Smokie0
Expert
23. 5. 2008   #11
-
0
-

To som skusil, ale monodevelop to neberie, da mi ponuku metod Equals a ReferenceEquals, ale nie tie metody, co su v triede Room.

Cele to je trosku zlozite, lebo je to zadanie a boli nam predpisane rozhrania v ktorych to mame robit a tie su trosku nestastne riesene.
Ide o to, ze hrac sa pohybuje medzi miestnostami po mape. Kazda miestnost ma 1 az 4 vychody (sever, juh,... - to je reprezentovane 4 boolovskymi premennymi). Vsetky miestnosti su instancie triedy Room, ktora ma okrem inych aj metodu GetRoomDirections, ktora vracia ArrayList so svetovymi stranami na ktorych je vychod z miestnosti.

V triede Game je metoda NextStep, ktoru sme teraz vyriesili a vdaka nej sa da pohybovat po miestnostiach. Ale skor ako to NextStep dovoli, tak musi zistit, kde ma aktualna miestnost vychody, na ktorych svetovych stranach a to robi prave metoda GetRoomDirections. Ale k nej sa neviem dostat, pretoze objekty triedy Room su vytvorene v inej triede. Skusil som urobit to, ze som zacal miestnosti vytvarat v triede Game, ale aj tak mi to nepomohlo, pretoze su v inej metode a vtedy s nimi tiez nechce pracovat.

Je dost mozne, ze to robim prilis komplikovane a existuje lepsi sposob... :)

Nahlásit jako SPAM
IP: 88.212.21.–
23. 5. 2008   #12
-
0
-

To Smokie : A je ta metoda viditelná zvenku (modifikátor public)?

Nahlásit jako SPAM
IP: 84.21.124.–
Dušan Janošík | web: djanosik.cz, @djanosik
Smokie0
Expert
23. 5. 2008   #13
-
0
-

Ano je :)
public ArrayList GetRoomDirections()

Nahlásit jako SPAM
IP: 88.212.21.–
23. 5. 2008   #14
-
0
-

Nj, musel bych se na to podívat, ale teď na to nemám moc čas.

Nahlásit jako SPAM
IP: 84.21.124.–
Dušan Janošík | web: djanosik.cz, @djanosik
Smokie0
Expert
23. 5. 2008   #15
-
0
-

To nevadi, tak sa to neponahla :)

Nahlásit jako SPAM
IP: 88.212.21.–
PaLaDiN
~ Anonymní uživatel
30 příspěvků
23. 5. 2008   #16
-
0
-

Tie izby sa ti vytvárajú nejak dinamicky počas behu podľa nejaký kritérií ktoré interagujú s uživateľom, alebo ich už poznáš počas spustenia programu?

Lebo v prípade, že sú počas spustenia tak celú triedu room definuj ako static a potom sa nemusiš odkazovať na žiaden vytvorený objekt.

Nahlásit jako SPAM
IP: 88.212.23.–
Smokie0
Expert
23. 5. 2008   #17
-
0
-

PaLaDiN napsal:
Tie izby sa ti vytvárajú nejak dinamicky počas behu podľa nejaký kritérií ktoré interagujú s uživateľom, alebo ich už poznáš počas spustenia programu?

Lebo v prípade, že sú počas spustenia tak celú triedu room definuj ako static a potom sa nemusiš odkazovať na žiaden vytvorený objekt.

Izby vytvaram ja pred spustenim v kode. Interakcia s hracom spociva v podstate len v predmetoch, ktore sa v izbe nachadzaju, lebo hrac ich moze vziat do batohy a pripadne nejaky predmet z batoha pouzit na predmet v miestnosti.

Ale vyriesi to ten problem? Lebo cely zadrhel je v tom, ze napriklad objekt oRoom1 ako instancia triedy Room, teda izba, je v triede Game, kde je spominana metoda NextStep je uplne neznamy. Aj ked v tele tej metody napisem oRoom1.GetRoomDirections(); tak mi vypise chybu, ze oRoom1 je v tomto kontexte neexistuje.

Nahlásit jako SPAM
IP: 88.212.21.–
Smokie0
Expert
23. 5. 2008   #18
-
0
-

Ono sa to chova takto...
Mam triedu A, v nej metody M1 a M2.
V M1 vytvorim objekt O, instanciu triedy B, a mozem pouzivat jeho metody. Ale ak chcem tieto metody volat v metode M2, tak uz mam problem a O v kontexte M2 neexistuje. A vsetky metody a konstruktor O je public.

Nahlásit jako SPAM
IP: 88.212.21.–
PaLaDiN
~ Anonymní uživatel
30 příspěvků
23. 5. 2008   #19
-
0
-

Aha! :)

Problém je tom, že daná inštancia (teda odkaz na ňu) ti zanikne v M1.

vyriešil by to buď ten static lebo potom ti existuje práve jedna inštancia počas celého behu programu,
alebo definovať O o úroveň vyžšie, teda ako člena triedy. v takom prípade bude O viditeľný vo všetkých metódach triedy a vlastne v celej triede.

Nahlásit jako SPAM
IP: 88.212.23.–
23. 5. 2008   #20
-
0
-

To Smokie : Tak O definuj v A, instanci vytvoř v M1 a můžeš s ním pracovat i v M2.

public class A

{
private O oclass = null;

public A()
{
}

public void M1()
{
if(oclass == null)
{
oclass = new O();
}
}

public void M2()
{
if(oclass != null)
{
// tady pracuješ s objektem O
}
}
}


Zbytek si ošetři, jak potřebuješ.

Nahlásit jako SPAM
IP: 84.21.124.–
Dušan Janošík | web: djanosik.cz, @djanosik
Smokie0
Expert
23. 5. 2008   #21
-
0
-

2paladin: To chapem, pomohol si mi :) Cize ked urobim konstruktor static, tak potom vytvorenu instanciu viem pouzivat v akejkolvek metode a triede v celom programe? Ale potom mam problemy s parametrami, nie? :)

A ten druhy sposob. To mi funguje. Ale ako poskytnem objekt vsetkym triedam? :)

Nahlásit jako SPAM
IP: 88.212.21.–
Smokie0
Expert
23. 5. 2008   #22
-
0
-

djanosik: vdaka :)

Nahlásit jako SPAM
IP: 88.212.21.–
Smokie0
Expert
23. 5. 2008   #23
-
0
-

Napadla mi jedna vec... Ak som vsetko spravne pochopil, tak ak je konstruktor static, tak objekty nim vytvorene su viditelne a pouzitelne v kazdej triede programu. Ale nemozu mat parametre.

A tak mi napadlo, ci nemozem parametre vlozit do takehoto objektu pomocou setterov?

Nahlásit jako SPAM
IP: 88.212.21.–
23. 5. 2008   #24
-
0
-

To Smokie : Ne, nepochopil. Máš velké mezery, cos v tý škole dělal?

Nahlásit jako SPAM
IP: 84.21.124.–
Dušan Janošík | web: djanosik.cz, @djanosik
Smokie0
Expert
23. 5. 2008   #25
-
0
-

Tieto veci bohuzial v skole vobec neboli precvicene. Tam sme sa hrali len s dvoma triedami, ale taketo pripady sa vobec neriesili. A potom sa uz islo na pretazovanie, dedicnost, polymorfizmus, serializaciu a podobne.

Nahlásit jako SPAM
IP: 88.212.21.–
Smokie0
Expert
23. 5. 2008   #26
-
0
-

Tak ako teda vytvoreny objekt zviditelnit pre vsetky triedy? :)

Nahlásit jako SPAM
IP: 88.212.21.–
Smokie0
Expert
23. 5. 2008   #27
-
0
-

Aaa...dobre. Uz sa mi konecne podarilo vyriesit to co ma cely den drzalo v sachu...

Mne totiz vobec nenapadlo, ze objekty sa daju zadavat metodam ako vstupne parametre... Potom uz nie je problem s akymkolvek objektom pracovat v akejkolvek triede a metode...


Aj ked obcas mi vypisuje chybu

Inconsistent accessibility: 

parameter type `TextGameInterfaces.Room' is less accessible than method
`TextGameInterfaces.IStep.GetRoomDescription(TextGameInterfaces.Room)'(CS0051)]

a v tomto pripade konkretne pri riadku
 string GetRoomDescription(Room room);
, ktory sa nachadza v definicii interfaceu IStep a vstupny parameter Room room mam aj pri definicii tejto metody.

Nahlásit jako SPAM
IP: 88.212.21.–
23. 5. 2008   #28
-
0
-

To Smokie : Přečti si tu chybu, zkus si jí přeložit, případně ten kód zadat do googlu.

Nahlásit jako SPAM
IP: 84.21.124.–
Dušan Janošík | web: djanosik.cz, @djanosik
Smokie0
Expert
23. 5. 2008   #29
-
0
-

Ale taka blbost a ja som pri tom sedel skoro den a pol...

Nahlásit jako SPAM
IP: 88.212.21.–
Smokie0
Expert
23. 5. 2008   #30
-
0
-

djanosik napsal:
To Smokie : Přečti si tu chybu, zkus si jí přeložit, případně ten kód zadat do googlu.

Stalo sa. Nasiel som to na MSDN. Je to len o tom, ze jedna z tried nie je public...

Nahlásit jako SPAM
IP: 88.212.21.–
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 82 hostů

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032016 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý