Kezdőoldal » Számítástechnika » Programozás » C# globalizálás "public...

C# globalizálás "public static" megkerülése, hogyan? (bővebben lent)

Figyelt kérdés

A cél egyértelmű, egy osztályból példányokat létrehozni, azt bepakolni egy globális listába, amit ezentúl bárhonnan el tudunk érni, ha az osztály nevére hivatkozunk. Valamint az osztályban létrehozott metódusok is globálisak, ezt egy másik pl. fő osztály metódusában könnyen elérhetjük szintén az osztály_neve.Valami() módon. Mindenütt azt olvasom, hogy ez a megoldás a legrosszabb, nem esztétikus, és lehet máshogyan is. A kérdésem az, hogy hogyan? Tehát nálam így néz ki egy program általában:


public class valamiosztály


public valamivaltozó

public ...

...


public static List<valamiosztály> elemek...


public static void ValamiInicializálás()

...

public static void ValamiUpdate()

...



Innentől kezdve bármelyik osztályban tudok rá hivatkozni, mind a fontosabb metódusaira, mind az egyes példányokra a globális listának köszönhetően, legyen az sima for vagy foreach ciklus, mert általában ilyenkor kell. A kérdésem az, hogy hogyan lehet a globalizálás hiányában ugyanezt a hatást elérni? Tehát van több osztály, és van egy fő osztály, amiben mindent meghívok, pl. a fő osztály Update() metódusában. Ezen kívül nem csak a fő osztályon belül kell elérnem, hanem egyik-másik egyéb osztályban egy másik meglévőt. Tehát nem működik az az eset, hogy a "valamiosztály" nem globális, aztán a fő osztályban csak létrehozok egy sima Listát, mert azt csak ott fogom tudni elérni, másik egyéb osztályban ha újabb ilyen listát hozok létre, az az előzőtől teljesen független. Nekem pedig egy közös listát kell elérnem minden esetben. Na ilyenkor hogy lehet megkerülni a globális megoldást?


Nekem főleg játékhoz kell. MonoGame-t használok (régen XNA néven futott), és ebben van egy fő Game1.cs, melynek megvannak a saját előre legenerált metódusai: Initialize(), LoadContent(), UnloadContent(), Update(), Draw(). Utóbbi kettőben van fontos szerepe a globális konténernek és metódusoknak. A fő Update()-ba pakolom be az összes egyéb osztály globális metódusait az osztály nevével hivatkozva azokra, kirajzoláskor meg egyszerűen egy for/foreach ciklussal kezelem az összes adott egyéb osztály globális elemeit, melyekre szintén az osztály nevével hivatkozhatok egyszerűen. Nekem Így a legátláthatóbb és legkönnyebb, viszont akárhol ezt felvetem ellenzik, hogy ha csak lehet kerülni kell a staticolást. Értem én hogy mit takar az, hogy az fixen le van generálva a memóriában, de viszont pl. egy Lista esetében nem az összes 1000+ elem lesz statikus, csak maga a lista mint tároló, amiben dinamikus elemek vannak, szóval nem értem ez miért olyan gáz. Remélem valaki tud segíteni.



2015. júl. 19. 13:12
 1/6 anonim ***** válasza:
Legyen a Mainben egy objektum a központi osztályból, és amikor létrehozol egy másik osztályt, akkor ezt paraméterként átadod.
2015. júl. 19. 13:17
Hasznos számodra ez a válasz?
 2/6 anonim ***** válasza:
Ez egy jó megoldás a processzor szempontjából. Emberileg persze nem annyira követhető. A korrekt válasz az, hogy van alternatíva, de az nem ilyen optimalizált. El kell dönteni, hogy melyik legyen.
2015. júl. 19. 14:28
Hasznos számodra ez a válasz?
 3/6 A kérdező kommentje:

Első:


Köszönöm, majd kipróbálom, bár sejtem mire gondolhatsz. :) Az egyéb osztályok örökölnék a fő osztályt, és akkor el tudják érni mindazt ami ott van ugye? És akkor a fő osztályban 1x létrehozok egy példányt, valamint ugyanezekből egy listát is ugye? Akkor a fő osztályban, és az összes többiben is tudok rá hivatkozni, ha az összes egyéb örökli a fő osztály tulajdonságát.



Második:


Melyik megoldásra írtad? Az enyémre, vagy a válaszolóéra? Nekem a sajátom nagyon is átlátható, küldhetnék is konkrét sablont, hogy élesben mikor és hogyan alkalmazom, tudod a kód nagyon banálisan egyértelművé tenné, hogy miért szorulok rá a globalizálásra, ezt szavakkal nehezebb elmondani. :)

2015. júl. 19. 14:44
 4/6 anonim ***** válasza:
#2-es vagyok a tiédre értettem, de küldhetsz példát.
2015. júl. 19. 19:30
Hasznos számodra ez a válasz?
 5/6 anonim ***** válasza:

Nem teljesen ertem, hogy mi ezzel a problema, marmint oke, hogy csak atfutottam a kerdest, mert kicsit hosszu es kusza, de hol a gondod a listaval?


Itt peldanyok vannak amiket hivni akarsz vagy statikus hivasok?

(Utubbi esetben nem pontosan tudom, hogy mit tamogat a C#.)


Ha konkret peldanyaid vannak, akkor egyszeruen csinalj egy kontener osztalyt, amiben van egy lista.

Ehhez a listahoz csinalj egy add metodust, amivel tudsz bele tenni peldanyokat.


Majd ebben az osztalyban (bar kulon lehet szebb lenne, de most mindegy) lehet egy update fuggveny, ami nem csinal mast, mint vegig megy a listan es minden elemnek meghivaj az update metodusat.


Ez egy mukodo es jo megoldas lehet.


Ja meg nem art, ha felveszel egy interface-t amiben van Update() stb.. amit hivni akarsz kozosen rajtuk fuggveny es a lista ilyen interface-t teljesito tipusokat varjon.

Innentol barmilyen osztaly teheto majd bele, ami implementalja az interfacet.

2015. júl. 20. 08:33
Hasznos számodra ez a válasz?
 6/6 anonim ***** válasza:

Ja es ha meg 1-1 elemre akarsz hivatkozni, akkor sima lista helyett valamilyen Map-el is dolgozhatsz es cimkezheted a bepakolaskor az elemeket.


Vagyis az add-nal megadsz egy nevet, majd hozza a konkret peldanyt es letarolod, majd csinalhatsz neki egy get hivast, amit az adott cimkejuk elemet adja vissza.


Igy 1-1 elemet ki is vehetsz.

DE egy hatranya van, hogy ha nincs meg adott cimkeju elem a kontenerben, akkor hibat fogsz kapni.

(Hasonlo megoldast hasznalnak a dependency injection kontenreknel.)

2015. júl. 20. 08:37
Hasznos számodra ez a válasz?

Kapcsolódó kérdések:




Minden jog fenntartva © 2024, www.gyakorikerdesek.hu
GYIK | Szabályzat | Jogi nyilatkozat | Adatvédelem | Cookie beállítások | WebMinute Kft. | Facebook | Kapcsolat: info(kukac)gyakorikerdesek.hu

A weboldalon megjelenő anyagok nem minősülnek szerkesztői tartalomnak, előzetes ellenőrzésen nem esnek át, az üzemeltető véleményét nem tükrözik.
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!