Permalänk
Medlem

C# (XNA) - Vad är detta?

Jag är nybörjare vad det gäller programmering (och XNA) och hittade denna kod i en text om hur man använder ljud i XNA:

Från en Game component anropar han en metod som ligger i Game1 klassen som spelar upp ett ljud. Grejen är att jag aldrig sett denna syntax ((Game1)Game) och trodde man att man måste göra en instans av en klass för att anropa dess metoder, vad är det här och vad kallas det?

Permalänk
Medlem

Klassen Game1 ärver ifrån Game. Då kan man casta en instans av Game1 till en Game och tillbaka igen

class Game
{
public void Metod1();
}

class Game1 : Game
{
public void Metod2();
}

Game1 x = new Game1();

Game y = (Game) x;

Game1 z = (Game1) y;

Med x kan du komma åt Metod1 + Metod2.
x.Method1();
x.Method2();

Med y kan du endast komma åt Metod1. Du kan dock tillfälligt göra en cast till Game1 och då komma åt Metod2;
((Game1) y).Method2();

Visa signatur

[Asus P5B Dlx 430Mhz FSB] :: [Core 2 Duo E6400 2130@3440Mhz / Big Typhoon] :: [G-Skill PC6400 HZ DDR2 2GB 4-4-4-12] :: [X1900XT 680/800] :: 30" Dell 3007WFP

Permalänk
Medlem

(Game1)Game gör en casting av instansen Game till typen Game1.

Lättare att förstå är att konvertera mellan olika typer av tal.

float tal = 1.625f;
Console.WriteLine(tal);
Console.WriteLine((int)tal);
Console.WriteLine(tal);

Output:
1.625
1 // decimalerna försvinner när man konverterar en float till en int
1.625 // instansen av tal är orörd av den casting som gjordes innan

Edit: Inlägget redigerat. Tack Gnejs

Visa signatur

Citera för svar

MSI Z490 MAG TOMAHAWK | Intel Core i7 10700K | Corsair 64GB DDR4 3200MHz | Asus GeForce RTX 3060 Ti TUF Gaming OC | Samsung 970 EVO Plus 1TB | WD Black 6TB Desktop Drive | Corsair RM750X 750W | Fractal Design Define R6

Permalänk
Medlem

Konverterar är väldigt dåligt ordval, ingenting händer med själva objektet, castingen är endast hur det skall tolkas just då, objektet kommer aldrig ändras pga castingen vilket "konvertera" skulle betyda.
Annars var d bra exempel med talet

Kan också vara värt och kolla in polymorfism och den dynamiska bindningen som finns inom OOP när du ändå är inne på ämnet.

Visa signatur

Spelrigg: 800D| i7 3930K@4,7 GHz - Custom WC | 32 GB Kingston HyperX Beast | 7970 GHz X-Edition |1x30 Dell U3011, 2x27" | Sennheiser HD650 | Xonar Essence STX |
Laptop: G74SX 17,3" 120 Hz 3D |
Server: Phenom II X4 955BE | Corsair XMS3 8 GB | 16 HDDs, 27 TB |
HTPCs: ASUS EEE Box 1.8 Ghz | Blu-Ray | OCZ Vertex 2 60 GB | 4 GB RAM |

Permalänk
Medlem
Skrivet av Gnejs:

Konverterar är väldigt dåligt ordval, ingenting händer med själva objektet, castingen är endast hur det skall tolkas just då, objektet kommer aldrig ändras pga castingen vilket "konvertera" skulle betyda.
Annars var d bra exempel med talet

Kan också vara värt och kolla in polymorfism och den dynamiska bindningen som finns inom OOP när du ändå är inne på ämnet.

Jo uttrycket casting hade varit bättre att använda sig utav, dock så kom jag inte ihåg det då jag skrev inlägget.

Visa signatur

Citera för svar

MSI Z490 MAG TOMAHAWK | Intel Core i7 10700K | Corsair 64GB DDR4 3200MHz | Asus GeForce RTX 3060 Ti TUF Gaming OC | Samsung 970 EVO Plus 1TB | WD Black 6TB Desktop Drive | Corsair RM750X 750W | Fractal Design Define R6

Permalänk
Medlem

Så om man har en instans av en basklass och vill komma åt en metod som ligger i en subklass till den basklassen så kan man tillfälligt konvertera instansen till en instans av subklassen och anropa metoden?

Permalänk
Hedersmedlem
Skrivet av Murloc:

Så om man har en instans av en basklass och vill komma åt en metod som ligger i en subklass till den basklassen så kan man tillfälligt konvertera instansen till en instans av subklassen och anropa metoden?

Nja, det är väl snarare som svolter visar att om man har en basklassvariabel som pekar på ett objekt av en underklass kan man konvertera tillbaka variabeln till originaltypen för att åter få tillgång till objektets samtliga egenskaper.

Permalänk
Medlem
Skrivet av svolter:

Game y = (Game) x;

Game1 z = (Game1) y;

Vad är det som händer på de här två raderna?

Permalänk
Medlem
Skrivet av Murloc:

Vad är det som händer på de här två raderna?

På rad 1 castas x till y i en så kallad upcast. Då alla subklasser av Game ÄR en Game är det i praktiken bättre att bara skriva Game y = x;, men jag gissar att svolter ville göra en explicit cast i undervisningssyfte.

Rad 2 castar y till Game1 igen. Detta kallas downcast och måste göras explicit eftersom det aldrig går att garantera att en variabel av basklassens typ håller ett värde av en viss specifik subklass.
Man ska akta sig för downcasts eftersom de inte är typsäkra; kompilatorn kan aldrig garantera att en cast kommer att lyckas. Se sista raderna i exemplet nedan.

class Frukt {} // basklass class Apelsin : Frukt {} class Banan : Frukt {} Apelsin a = new Apelsin(); Frukt f1 = a; // en apelsin är alltid en frukt Frukt f2 = new Banan(); // en banan är också alltid en frukt... Banan b = (Banan)f2; // ..men en frukt är inte alltid en banan, därför måste vi i detta fall casta Frukt f3 = Databas.laddaEnFrukt(); // returnerar antingen en Apelsin eller en Banan Banan b2 = (Banan)f3; // kompilerar men ger exception vid runtime om f3 håller en Apelsin

Konvertera är precis som Gnejs redan sagt inte ett korrekt ord för att beskriva en cast. Till exempel kan du inte göra int why = (int)"42"; för att omvandla ett strängvärde till en int.

Visa signatur

Kom-pa-TI-bilitet