Kezdőoldal » Számítástechnika » Programozás » C# Type "Type-pal" lennel...

Davidson996 kérdése:

C# Type "Type-pal" lennel dolgom, mint metódus paraméterrel, valaki tud segíteni?

Figyelt kérdés

Szóval a célom az lenne hogy létrehozok egy (kostruktor) metódust ami így nézne ki:

public Player(Type shipType) { ... }


a példa kedvéért:

public class Ship

public partial class SmallShip : Ship

public partial class NormalShip : Ship

public partial class BigShip : Ship


1. Az első problémám hogy nemtudom kiolvasni a shipType változót:

if (shipType == SmallShip) { ... } > erre azt írja hogy a SmallShip nem változó, hanem típus, rosszul használom.


2. A második problematikám meg az lenne hogy csak olyan Type-ot lehessen megadni paraméterként ami a Ship typeon belül van, tehát Ship,Smallship,Normalship,Bigship-et, vagy úgy mégjobb lenne ha még a Ship-et se, csak az al-class-eit.


Esetleg ha még erre is tudja valaki a választ: A Player class tartalmas ez Ship változót, ami az űrhajó amit megjelenít a játék (XNA 2D). A Ship class nagyon sok altípust tartalmaz, és mindnek ugyanolyan kostruktormetódusa van. Jólenne ha bármilyen Ship class-t írok be paraméterként azt létrehozza valahogy így:


public Player([Type > in Ship] shipType)

{

this.TheShip = new shipType(xyz);

}


Olvastam hogy egy kérdésben csak 1 dolgot tegyek fel, de ezek egybe tartoznak szerintem.

Ha valaki tud segíteni nagyon megköszönném!!!



2013. jan. 13. 14:35
 1/7 _Jessy_ ***** válasza:

public Player(Type shipType) helyett:

public Player(Ship shipType);


if (shipType == SmallShip)

ha valamiről meg akarod állapírani, hogy SmallShip a típusa vagy sem, akkor azt valahogy így kell:

object.GetType() == typeof(SmallShip)

2013. jan. 13. 15:22
Hasznos számodra ez a válasz?
 2/7 A kérdező kommentje:
Csak az a baj hogy amikor létrehozom a Player-t akkor meg kell adnom a hajót ami hozzá tartozik, és ez mindig új hajó lesz természetesen. Ha a hajó létezik hogy beírjam a paraméterbe akkor előtte létre kell hoznom, csakhogy amikor létrehozok egy űrhajót, akkor meg kell adnom neki hogy ki a Parent-je (a player aki tartalmazza). Ezért gondoltam úgy, hogy megadom a Player létrehozásánál hogy milyen űrhajója lesz, és a konstruktor metódusban elkészíti azt magának, közben bele is írja hogy ő a Parent. Mondjuk az is egy lehetőség hogy készítek egy Parent nélküli konstrucktort a Ship típusra... csak reméltem hogy így is van lehetőség valamilyen módon.
2013. jan. 13. 15:35
 3/7 anonim ***** válasza:

amit az első válaszoló írt az jó. ha mindenképp Typeot szeretnél átadni, akkor így nézhet ki a constructorod:


public Player(Type shipType)

{

this.TheShip = (Ship)Activator.CreateInstance(shipType);

}


hívni:

new Player(typeof(SmallShip))


Persze ekkor nem csak Ship típust lehet megadni.

A konstruktorban esetleg a Type.IsSubclassOf vagy Type.IsAssignableFrom-mal el lehet dönteni futásidőben, de ez nem túl szép.


Én a helyedben készítenék egy ShipType enumot, és azt adnám át.

2013. jan. 13. 15:52
Hasznos számodra ez a válasz?
 4/7 anonim ***** válasza:

Tipikus tervezési hiba, ezért akadsz bele ilyenekbe.

[link]


Meg lehetne oldani egy generikus Player osztállyal, de nem erre találták ki, másrészt attól még hibás lenne.

Valami factory pattern féleségre lesz szükséged.


Pl:

[link]


Ezt meg nem ártana olvasgatni kicsit:

[link]

2013. jan. 13. 20:10
Hasznos számodra ez a válasz?
 5/7 anonim ***** válasza:
Előttem válaszolók meg remélem még nem dolgoznak éles szoftveren sehol :)
2013. jan. 13. 20:11
Hasznos számodra ez a válasz?
 6/7 anonim ***** válasza:
Mért is? Adott volt egy kérdés, és válaszoltunk rá. Ez nem jelenti azt, hogy mi ilyen kódot írnánk. Én speciel írtam is, hogy csúnya.
2013. jan. 13. 20:26
Hasznos számodra ez a válasz?
 7/7 A kérdező kommentje:
Nagyon köszönöm a válaszokat, látom sok hasznos dolgot kaptam :) Még nagyon az elején vagyok a dolgoknak. Azthiszem ennyi segítséggel már menni fog, még egyszer köszi :)
2013. jan. 16. 20:00

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!