Toon posts:

[java]klasse design probleem

Pagina: 1
Acties:

Verwijderd

Topicstarter
Voor school zijn we weeral een oefeing aan het maken in java. Nu werkt ze helemaal maar ben ik er zelf niet uit of het design wel helemaal correct is. Misschien kunnen jullie mij wat tips geven!

geg:
volgende uml

Afbeeldingslocatie: http://users.pandora.be/sgweb/4.jpg
-abstracte klasse BewegendVoorwerp (methodes: isInHitzone(x,y):boolean >> deze methode geeft true terug als de muisaanwijzer in het object staat)
-klasse Kanon erft over van BewegendVoorwerp (mijn kanon moet je kunnen verplaatsen)
-wapenIF: interface met volgende methodes: mik(),schiet():,herlaad().
-Kanon implementeert de interface wapenIF

Nu heb ik een composition klasse gemaakt bestaande uit een kanon (en doelwitten, maar dit is nu niet ter zake). Aangezien ik de applicatie uitbreidbaar wil maken heb ik in plaats van instantie mijnWapen van het type kanon, het type WapenIF gebruikt.

probleem:
Java:
1
mijnWapen.isInHitzone()

deze code werkt uiteraard niet, want in de interface is niet voorzien dat hij moet kunnen worden versleept.

Wat zijn de mogelijk oplossing hiervoor?

1)Interface VersleepbaarVoorwerp bijmaken, WapenIF laten overerven van deze interface.
Vraag is natuurlijk: is een wapen per definitie versleepbaar? mja in mijn toepassing nu wel, dus zou de interface wapen toch moeten kunnen worden versleept niet!?

2)Een andere mogelijkheid is de volgende:
Java:
1
2
3
4
5
6
7
8
if (instanceOf mijnWapen is Kanon){
    Kanon kanon = (Kanon) mijnWapen;
    if (kanon.isInHitzone(x,y)){
        //het punt van het kanon aanpassen aan nieuwe locatie
        //zoals je kan zien: setPunt is overgerft van VersleepbaarVoorwerp
        kanon.setPunt(kanon.getPunt().moveBy(x,y));
    }
}

principe: functionaliteit heb je alleen maar volledig als je met MIJN wapen werkt :)

[ Voor 3% gewijzigd door Verwijderd op 06-12-2003 12:20 ]


  • drm
  • Registratie: Februari 2001
  • Laatst online: 09-06-2025

drm

f0pc0dert

offtopic:
Mag ik je allereerst aanraden volledig altijd en overal Engelse code te gebruiken? Dit is echt zo verschrikkelijk slecht leesbaar. Aan de ene kant setAngle en aan de andere kant mik 8)7


Ik zou zelf een interface Movable aanmaken, waarin ik een aantal methoden definieer, zoals setX, setY, setZ, moveTo ( int, int, int ), getPosition (), eventueel een extra klasse ThreeDPosition waarin je een x, y en z op kan geven.

Vervolgens een standaard Mover die de methoden van Movable op een standaard wijze implementeert.

Weapon zou ik een interface maken die analoog is met jouw "WapenIF"

Tot slot als een object zou moeten bewegen kijk je of het een instance is van Movable en maak je een Movable pointer aan naar dat object om daar de "move" functies op los te laten.

Java:
1
2
3
4
5
6
if ( obj instanceof Movable ) {
   Movable ptr = (Movable) obj;

   obj.moveTo ( x, y, z ); // of
   obj.moveTo ( new ThreeDPosition ( x, y, z ) ); // eigenlijk iets mooier
}


Hetzelfde voor Weapon interfaces of andere eventuele interfaces.



Tot slot: ik denk dat je dit soort constructies wel zo veel mogelijk moet zien te voorkomen. Een instanceof is eigenlijk een laatste redmiddel als Java je niet meer de kans geeft de typesafety te garanderen. Je zou wellicht wel gewoon je hele ontwerp van je code aan moeten passen, en niet zo zeer van je klassenstructuur.

Music is the pleasure the human mind experiences from counting without being aware that it is counting
~ Gottfried Leibniz


Verwijderd

Topicstarter
Ik heb je raad gevolgd en aantal aanpassing gedaan:

Afbeeldingslocatie: http://users.pandora.be/sgweb/5.jpg

uitleg bij figuur:
-zowel MyObject als MovableObject zijn abstracte klassen.
-WeaponIF extends MovableObjectIF dat op zijn beurt ObjectIF extend

Nu heb ik links mijn interfaces gedefinieerd staan en rechts mijn abstracte klasses.

Waarom beide zullen jullie je afvragen: nu heb ik zowel die interface nodig (zodat ik later makkelijk een ander wapen kan plaatsen in mijn wereld dat voldoet aan WeaponIF) en ik heb centrale code nodig om mijn getters en setters af te handelen

Moet er worden gerefactored? Is deze aanpak de juiste? Wat kan er beter? het werkt hoor, ik doe het gewoon voor mijn eigen plezier om er is een beetje over na te denken!
ps: code staat nu ook bijna allemaal in het engels :)

[ Voor 11% gewijzigd door Verwijderd op 06-12-2003 23:21 ]