Java problem variabler abstrakta klasser

Permalänk
Medlem

Java problem variabler abstrakta klasser

Hejsan
Jag och en polare sitter och tänker göra ett enkelt 2d java spel. Nu sitter jag och klurar på data strukturen.
Mit problem är att jag vill ha en abstrakt klass som heter MovingObjekt. Som ni kankse förstår så ska alla objekt som kan röra på sig extenda denna. Mitt problem är att Jag vill att varje movingObjekt ska ha fyra olika vyer(altså Images) beroende på vilken riktning figuren har. Lagrar dessa då i fyra olika variabler. Dessa variabler ska alla movingobjekts ha, men så klart olika bilder beroende på vad figurer det är(t.ex gubbe, hund katt etc). Ett sätt är ju att skicka in bilderna som parameter till konstruktorn, men det är ju ganska fult tanke på att om t.ex en klass "Hund" extendar MovingObjekt, så ska ju alla Hund objekt ha samma bilder. Så bilderna borde ju specifieras direkt i klassen.
Skulle vilja att det fanns typ abstrakta variabler i java som varje enskild klass måste ange dess värde^^.
Skulle vara kul om någon kunde hjälpa mig med någon fiffig lösning.
vet inte om jag är tillräckligt tydlig i beskrivningen, så kom gärna med frågor.
Tack på förhand!
Magnus

Visa signatur

Jag har en grm dator

Permalänk
Medlem

Jag skulle gå en bit längre och objektorientera bilderna.
Gör ett ImageHandler-objekt som har alla bilder som krävs.
Du kan göra statiska metoder som returnerar en singleton instans av ImageHandlern.

Sen kan du göra en abstrakt metod som heter getImageHandler() där varje överlagring returnerar ett färdigt statiskt objekt.

public class Hund extends MovingObject { @Override public ImageHandler getImageHandler() { ImageHandler.getHandler(ImageHandlers.DOG); } }

Det är i alla fall en väg att gå.

Blandar ihop C# med Java hela tiden... :)
Visa signatur

ηλί, ηλί, λαμά σαβαχθανί!?

Permalänk
Medlem

Det där det ser ganska fiffigt ut, får ta och testa och se hur de blir
Tack för svaret

Visa signatur

Jag har en grm dator

Permalänk
Medlem
Skrivet av Welor:

Det där det ser ganska fiffigt ut, får ta och testa och se hur de blir
Tack för svaret

Jag glömde kanske argumentera om varför.
Undvika att personen som vill använda Hund-klassen ska behöva veta att instansiera den med rätt värden.
Undvika att varje klass som ärver från MovingObject måste ha exakt fyra bilder/metoder att implementera. Det kan finnas fall då man bara vill ha en bild för alla, ingen eller flera än fyra. "Ingen" i detta fall kan även den vara en instans av ImageHandler, allt för att slippa hantera null-hantering i spelmekaniken så långt det går.
Få ett objekt att arbeta med istället för fyra bilder. Objektet kan i sig ha övrig information som ska gälla just bildhanteringen för varje specifik instans.

Det finns flera sätt att uppnå samma resultat. I detta fall så har ImageHandler en statisk metod vid namn getHandler() som tar emot en enum. Detta för att slippa göra en ny metod för varje typ. getHandler() bör köra en instansiering av alla objekten _en_ gång. Efter det så är alla objekt laddade. Ska man optimera så bör man tänka på att instansiera alla vid första användning istället för alla vid första användning av något av objekten. Om det tar lång tid för varje instansiering så är det bättre att ladda alla på en gång så man inte får laddning under körning.

Men... du kan ju alltid göra fyra abstrakta set-metoder om du ändå vill ha riktiga metoder på varje objekt. De överlagrade set-metoderna kan sätta protected-variabler i den abstrakta klassen. get-metoderna bör vara publika i den abstrakta klassen då dessa endast används för åtkomst till de protectade variablerna. För att sätta rätta bilder på rätt klasser så kan du antingen göra en reflection-setter första gången när man "petar" på en get-metod eller en explicit statisk initierar-metod. Då reflectionkoden endast körs en gång så är det inget direkt hinder för prestanda. Oavsett vad hade inte gjort det på detta vis, men det är ett alternativ om du vill ha metoderna direkt på objektet.

Visa signatur

ηλί, ηλί, λαμά σαβαχθανί!?