Avatar billede mickni33 Nybegynder
28. april 2004 - 11:31 Der er 26 kommentarer og
4 løsninger

polymorfi abstrakte klasses

Min compiler laver bøvl over dette

public class Klasse1{

private Session    session;  //abstrakt klasse
private RaceSession racesession;// arver fra den abstrakte klasse

public void MinMetode(){
session = new RaceSession(); // session bliver til RaceSes
session.gørNoget();
racesession=session;        // dette kan man ikke
}
}


det jeg vil er at jeg har en metode i racesession klassen som skal udføres, men den kan jeg ikke kalde herfra.
compileren siger at metoden skal oprettes i den abstrakte klasse før at jeg kan kalde den. men den skal ikke være abstrakt for det er jo kun racesessiion der skal bruge den.

Jeg ville bare mene at når man sagde session= new RaceSession så kunne session få fat på alle metoder i RaceSession klassen, men det kan den ikke , det er kun metoderne fra den abstrakte Session klasse der kommer frem.
derfor troede jeg man kunne sige racesession=session;

Er der nogen der har en ide til hvad man kan gøre?
Avatar billede arne_v Ekspert
28. april 2004 - 11:46 #1
racesession = (RaceSession)session;       

bør compile.
Avatar billede arne_v Ekspert
28. april 2004 - 11:48 #2
Men design bør nok ændres lidt.

Enten bør du nok kun have en reference til en RaceSession kun en reference til
en Session.

I det sidste tilfælde laver du abstrakte metoder i Session, så du kan kalde
dem selvom du kun har en Session reference.
Avatar billede mickni33 Nybegynder
28. april 2004 - 11:48 #3
ja det kan den godt og det virer.
men er det ikke FUSK når man snakker om objektorienterde og polymorfi ?
Avatar billede mickni33 Nybegynder
28. april 2004 - 11:51 #4
jeg har en Trainingsession klaase og en Racesession klasse de bruger de samme metoder fra session MEN

Racesession klassen er så tilknyttet en highscore klasse og det er de metoder jeg vil have fat på. og det kan jeg ikke ved at sige session.getHighscore() selvom session= new Racesession()

det var det jeg troede
Avatar billede arne_v Ekspert
28. april 2004 - 11:56 #5
Jo det er fusk med den type cast.

Se min 11:48:12 kommentar.
Avatar billede arne_v Ekspert
28. april 2004 - 11:56 #6
Eksempel:

abstract class Animal {
    abstract String getSound();
    abstract String getName();
    void talks() {
      System.out.println(getName() + " siger: " +
                        getSound() + " " + getSound() + " " + getSound());
    }
}

class Dog extends Animal {
  String getSound() {
      return "vov";
  }
  String getName() {
      return "Hunden";
  }
}

class Cat extends Animal {
  String getSound() {
      return "mjav";
  }
  String getName() {
      return "Katten";
  }
}

class Bird extends Animal {
  String getSound() {
      return "pip";
  }
  String getName() {
      return "Fuglen";
  }
}

public class TestAbstract {
  public static void main(String[] args) {
      Animal p;
      p = new Dog();
      p.talks();
      p = new Cat();
      p.talks();
      p = new Bird();
      p.talks();
  }
}
Avatar billede mickni33 Nybegynder
28. april 2004 - 11:59 #7
men hvad hvis der var en metode som hed "return flyv" i fugle klassen og den ville du gerne have fra main af, fuglen er jo den eneste der kan flyve og er derfor kun defineret der.
Hva så ?
Avatar billede mickni33 Nybegynder
28. april 2004 - 12:01 #8
husk at lave et svar :-)
Avatar billede arne_v Ekspert
28. april 2004 - 12:04 #9
Så skal man have en reference til Bird.
Avatar billede arne_v Ekspert
28. april 2004 - 12:04 #10
svar
Avatar billede mickni33 Nybegynder
28. april 2004 - 12:05 #11
men er det ikke det jeg gør ved at sige

racesession=session;

men det virker bare ikke
Avatar billede scheea2000 Nybegynder
28. april 2004 - 12:18 #12
Nu kender jeg ikke contexten hvor du skal bruge din racesession.
Udnyttelse af polymorfisme er jo at du er ligeglad med din konkrete klassetype, sålængde du nedarver fra din abstrakte klasse eller interface og har de metoder (i den abstrakte el. overrided), som du gerne vil ha.

Hvis du skal kalde en bestemt metode i racesession som de andre ikke har, er du netop IKKE ligeglad med den konkrete klasse.

Du kan spørge til den enkelte klasse, hvilken type den er og så typecaste den til racesession og kalde metoden.
Avatar billede mickni33 Nybegynder
28. april 2004 - 12:21 #13
scheea>>

ja det er netop det jeg har gjort ved at sige racesession=(RaceSession) session;
Men synes bare det var lidt fusket :-) at typecaste .
Avatar billede scheea2000 Nybegynder
28. april 2004 - 12:28 #14
Nej for du ved ikke om det ER en racesession -> typecastingfejl - det kunne også være en af dine andre konkrete klasser - derfor skal du teste klassen først.
Avatar billede mickni33 Nybegynder
28. april 2004 - 12:29 #15
nååå ok
Avatar billede scheea2000 Nybegynder
28. april 2004 - 12:32 #16
Men tænk stadig over dit design... hvorfor har du behov for at behandle én bestemt klasse et sted, hvor du er interesseret i at behandle alle konkrete klasser af din abstracte klasse?
Avatar billede mickni33 Nybegynder
28. april 2004 - 12:42 #17
som sagt har jeg en trainingKlasse og en raceKlasse de har fire ens metoder som er lagt i en abstrakt klasse.

raceKlassen har så det ekstra, at den kan kalde en highscore klasse og få highscore.

                |Session|  // er abstrakt
                    |
              |----|----------|
|Highscore|    |              |
    |          |              | 
    |---|Racesession|    |TrainingSession|
Avatar billede mickni33 Nybegynder
28. april 2004 - 12:42 #18
ashhhh okay det blev ikke så godt
Avatar billede scheea2000 Nybegynder
28. april 2004 - 12:44 #19
Hvor skal du kalde highscore metoden henne?
Avatar billede mickni33 Nybegynder
28. april 2004 - 12:45 #20
i raceSession
Avatar billede scheea2000 Nybegynder
28. april 2004 - 12:46 #21
Nej den ligger i raceSession - hvor skal du kalde metoden henne?
Avatar billede mickni33 Nybegynder
28. april 2004 - 12:50 #22
der er oprettet et objekt af highscore i Racesession.
så main opretter et RaceSessionOBJ og kalder en metode i RacesessionKlassen hvor der oprettes et objekt af Highscore.

og det er selvfølgelig kun når session=new Racesession() og ikke når session= new TrainingSession()
Avatar billede scheea2000 Nybegynder
28. april 2004 - 13:03 #23
Her er nogle forslag, og det er ikke for at blande mig i dit design ;)

Jeg går udfra at en RaceSession er en session bestående af flere races. Og Highscore er så samlet highscore over denne ene session og ikke over flere sessioner. (Er det til en gokart bane el et spil?)

I så fald, hvorfor har trainingSession så ikke et highscore object? I så fald kunne du lade din abstrakte klasse håndtere og behandle HighScore objectet - det er ikke sikkert det bliver brugt i traningSession, men muligheden er der.

Uanset hvad vil jeg nok placerer den i constructoren - så er du fri for at kalde en metode efter oprettelse af et sessions object.


Alternativt må du spørge objectet...over and out
Avatar billede scheea2000 Nybegynder
28. april 2004 - 13:04 #24
Og så lidt allivel - det ideele objectorienterede program ikke. Ofte er det så på kompromis af et dårligt optimeret program og redundant el. ubenyttet data/hukommelse.
Avatar billede mickni33 Nybegynder
28. april 2004 - 13:05 #25
har også overvejet bare at oprette den i den abstrakte klasse selvom Training klassen ikke skal bruge den
Avatar billede labanos Nybegynder
28. april 2004 - 14:04 #26
Det er vel alt i alt spørgsmålet om hvad man mest har brug for. Det polymorfiske kendskab eller ingen redundant kode. Hvis du vælger at lave higscore på det abstrakte niveau beholder du muligheden for polymorfi i dit design. Det har blot den bivirkning af du må lave en dummy impl. i de konkrete klasser der ikke skal bruge metoden. Alternativet er at du opnår et konkret kendskab netop der hvor du skal bruge highscore metoden.

Hvilken løsning der er "korrekt" afhænger nok meget af hvordan ens design er i forvejen og hvor stort behov man har på et senere tidspunkt. Men hvis man forestiller sig at der er flere der skal bruge highscore i fremtiden bør man nok beholde en abstrakt metode. Er det derimod tænkeligt at higscore i fremtiden kommer i flere klasser, men med forskellige implementationer kunne man evt. overveje at lave et highscore interface, og dermed beholde det polymorfiske kendskab.
Avatar billede scheea2000 Nybegynder
28. april 2004 - 15:47 #27
Hmmm labanos - forstår ikke helt hvad du mener:

1. Hvis han implementerer en metode, som benytter highscore klassen i den abstrakte "session", behøves han jo netop ikke at implementerer dem i sin konkrete klasser - kun hvis han vil override og implementerer en anden funktionalitet i den konkrete klasse. Er det interfaces og design-by-contract du tænker på?

2.Et highscore interface? Det er en klasse der ligger i hver session. Der er ikke behov for flere forskellige konkrete highscore af highscore og udnytte polymorf.

Jeg vil mene det pæneste OO mæssigt, kodemæssigt og udvidelsemæssigt er at lave det i den abstracte klasse og bruge den som default - hvis du har behov for specifik implementation i den konkrete klasse, så overrider du...
Avatar billede arne_v Ekspert
28. april 2004 - 18:29 #28
Problemet bør aldrig opstå.

Hvis highscore er en generel egenskab ved Session så har du ikke noget problem

Hvis highscore er en specifik egenskab ved RaceSession så vil du aldrig have
brug for at kalde highscore på en Session
Avatar billede mickni33 Nybegynder
29. april 2004 - 10:21 #29
Er det muligt at der findes et design pattern som kan klare dette ?
Avatar billede arne_v Ekspert
28. maj 2004 - 23:57 #30
ok ?
Avatar billede Ny bruger Nybegynder

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.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester