17. februar 2003 - 18:12Der er
29 kommentarer og 1 løsning
interfaces, overloading og måske patterns...
Problem:
Har to instanser a og b af henholdsvis klasserne A og B. Disse instanser bliver gemt i en Vector v. Yderligere opretter jeg en ny instans aa af klassen A. I klassen A skal der være en metode "printObject" der via overloading tager en instans af A eller B som input, og kan printe to forskellige strenge ud alt afhængig af input typen.
Dvs:
public class test{ static Vector v; public static void main(String[] args) { A a = new A(); A aa = new A(); B b = new B();
Højst sandsynligt kan det løses med et smart interface og ved at tilføje en metode til både A og B, men jeg er desværre kørt fast og kunne godt bruge noget inspiration... Hvad siger i ?
Ja ok. Men printObject er også bare et navn jeg har fundet på... I virkeligheden skulle det måske heller have heddet "act", da metoden bestemmer hvordan et objekt skal opføre sig når det "møder" et andet objekt ...
public class A implements AB { void act(A a) { // A møder et objekt af typen A og gør noget } void act(B b) { // A møder et objekt af typen B og gør noget } }
public class B implements AB { void act(A a) { // B møder et objekt af typen A og gør noget } void act(B b) { // B møder et objekt af typen B og gør noget } }
de skal i og for sig ikke interacte. Det eneste der så at sige skal ske er blot at der kaldes to forskellige metoder i den samme klasse, afhængig hvilken type objekt der bliver taget ud af vektoren ...
Man skal tænke sig om som bare p*kker når man laver et interface. Man kan ikke bare tilføje en ny metode, så man skal have rigtig meget styr på hvad man laver. Hvad gør printObject til en start? Kunne det laves med en statisk metode evt. i A eller B klassen, og derved anvendes uden en instans (A.printObject())?
Jeg skal have en metode i hver klasse således objektet af den pågældende klasse agerer ud fra hvad der bliver hevet ud af vektoren. Hvert objekt der bliver taget ud af vektoren er en aktør som det pågældende objekt skal reagerer differentieret overfor. Hvis det kan løses på anden måde er jeg også meget interesseret ...
Jeps jeg er med på interfaces... Jeg mener også der skal laves et interface hvis man skal løse mit problem, problemet er bare at det konkrete interface du foreslog ikke løser mit problem. Som du selv nævner kunne det jo let løses ved en masse if sætninger og instance of ... men det er jo ikke den elegante OO løsning... Der for dette indlæg.
Hvis du evt. fortalte lidt mere om A og B, så kunne vi måske få nogle gode ideer til, hvordan du kunne strukturere dit klasse hieraki, så du får en "pæn" løsning.
Det handler om at jeg skal simulere en predator prey situation, som foregår i en afgrænset verden (JFrame).
Forestil dig vi har en klasse der hedder Shark og en klasse der hedder Herring (sild). Vi antager således vi har flere objekter af klassen Shark og flere objekter af klassen Herring. For hvert objekt, altså sild eller haj, skal deres opførsel simuleres. Det vil sige hvis en sild befinder sig inde for en hvis afstand af en haj, vil hajen jagte silden. Hvis den derimod er tæt på en haj, kan det være den vil parre sig. Ideen er således at jeg vil gemme alle objekterne (fiskene og hajerne) i en Vector, for hver fisk er der også en position, således kan det afgøres hvilken en den aktuelle haj eller fisk først får øje på og agere efter. Det ville derfor være smart hvis både Shark og Herring klassen hver havde to forskellige implementationer af Act, en til hvis hajen så en sild og en hvis den så en anden haj og vice versa.
Det var så den lange forklaringe, håber det blev lidt mere klart ...
rettelse: "Hvis den derimod er tæt på en haj, kan det være den vil parre sig" -> "Hvis en haj derimod er tæt på en anden haj, kan det være den vil parre sig eller noget helt andet og har derfor en anden adfærd end hvis det var en sild den så."
OK - jeg tror jeg forstår problem-stillingen og kan også se nogle muligheder:
public abstract class Fish { private Position pos; public Position getPos() { return pos; } public void setPos(Position pos) { thos.pos = pos; } public abstract void meetOtherFish(Fish f); public abstract boolean isPredator(); }
public class Shark extends Fish { public void meetOtherFish(Fish f) { if(!f.isPredator()) { // forsøg at fange den } else (f instanceof Shark) { // check om den er sød } else { // uinteressant } return; } public boolean isPredator() { return true; } }
public class Herring extends Fish { public void meetOtherFish(Fish f) { if(f.isPredator()) { // flygt } else { // ignorer } return; } public boolean isPredator() { return false; } }
En normal klasse består kun af implementerede metoder.
Et interface består kun af abstrakte metoder.
En abstrakt klasse kan indeholde både implementerede metoder og abstrakte metoder.
D.v.s. sådan en blanding.
An abstrakt klasse kan ikke instatieres. Og det passer jo meget godt i dette tilfælde. Der er ikke nogen "Fish" objekter, men kun "Shark" og "Herring" objekter. Fish er en abstraktion.
I dette tilfælde er de abstrakte metoder isPredator og meetOtherFish nødt til at være abstrakte, da vi når de skal kaldes kun ved at vi har en Fish men ikke hvilken.
Men vi ved at alle Fish har de metoder som modelerrer den pågældende arts adfærd.
Men jeg synes ikke det passer ikke helt til din problem-stilling.
Tricket med Reflection kunne du derimod godt have brugt til at finde en metode med et argument af en type bestemt på runtime udfra et objekt du har hentet ud af din Vector.
Men reflection er lidt tungt og jeg vil kun anbefale det i situationer, hvor det er strengt nødvendigt.
Synes godt om
Ny brugerNybegynder
Din løsning...
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.