28. april 2004 - 11:31Der 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?
Denne side indeholder artikler med forskellige perspektiver på Identity & Access Management i private og offentlige organisationer. Artiklerne behandler aktuelle IAM-emner og leveres af producenter, rådgivere og implementeringspartnere.
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()
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(); } }
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å ?
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.
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.
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?
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()
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.
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.
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.
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...
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.