DeadManWalking Skrevet 20. april 2009 Del Skrevet 20. april 2009 Greit, neste oblig er lagt ut. Jeg er litt forvirret angående dette med generiske datatyper. Med oppgaven fulgte det tre interface som jeg skal lage klasser som implementerer. Greit nok. Interfacene heter; BinaerTre, Adresse og Kontakt. Hele oppgaven går ut på å lese inn kontakter fra en fil og sortere dem i et binært tre. Noe jeg fint hadde klart hadde det ikke vært for at det følger med tre interfaces. Selv om det er åpenbart hvilken datatype vi skal bruke så må alt være så jævlig objekt orientert. Jeg ligger ved alle de filene som fulgte med bare sånn at dere har all dokumentasjon for å klare å kommentere. BinaerTre Klikk for å se/fjerne innholdet nedenfor public interface BinaerTre<E extends Comparable<E>> extends Iterable<E> { /** Datainvariant for binaere soeketraer: * * For enhver node i treet, er verdien av noden stoerre enn verdien * til hver node i venstre subtre, og mindre enn verdien til hver node i * hoeyre subtre. */ /** * Finner et element i binaertreet. * * Soeking gjoeres slik: begynn ved roten av treet, og soek * rekursivt til venstre (hvis verdien er mindre) eller hoeyre * (hvis den er stoerre), inntil du finner noden med riktig verdi * (compareTo() == 0). Hvis du naar en loevnode uten aa ha * funnet verdien, finnes den ikke i treet. * * @param data * @return dataelementet fra treet som matcher 'data', eller null * hvis den ikke finnes */ public E finn(E data); /** * Setter inn et element av typen E i binaertreet. * * Innsetting gjoeres slik: begynn ved roten av treet, og soek * rekursivt til venstre (hvis verdien er mindre) eller hoeyre * (hvis den er stoerre), inntil man naar en loevnode i treet -- da * kan man legge til en ny node som venstre eller hoeyre barn * av loevnoden. * * @param data * @return true hvis vellykket, false hvis ikke */ public boolean settInn(E data); /** * Sletter et element av type E fra treet. Dette er ikke saa helt * enkelt... * @param data * @return true hvis vellykket */ public boolean slett(E data); /** * Henter antall elementer i treet. * @return */ public int hentAntall(); } Kontakt Klikk for å se/fjerne innholdet nedenfor public interface Kontakt extends Comparable<Kontakt> { /** * Henter fornavnet til kontakten * @return String fornavn */ public String hentFornavn(); /** * Henter etternavnet til kontakten * @return String etternavn */ public String hentEtternavn(); /** * Henter adressen til kontakten * @return Adresse adresse */ public Adresse hentAdresse(); /** * Henter foedselsdatoen til kontakten * @return Date foedselsdato */ public String hentFoedselsDato(); /** * Henter kategorien kontakten tilhoerer, eks. venner, jobb * @return String kategori */ public String hentKategori(); /** * Henter mobiltelefonnummeret til kontakten * @return int mobiltelefon */ public int hentMobilTelefon(); /** * Henter hjemmetelefonnummeret til kontakten * @return int hjemmetelefon */ public int hentHjemmeTelefon(); /** * Setter fornavnet til kontakten * @param fornavn */ public void settFornavn(String fornavn); /** * Setter etternavnet til kontakten * @param etternavn */ public void settEtternavn(String etternavn); /** * Setter adressen til kontakten * @param adresse */ public void settAdresse(Adresse adresse); /** * setter foedselsdatoen til kontakten * @param foedselsDato */ public void settFoedselsDato(String foedselsDato); /** * setter kategorien til kontakten, eks. venner, jobb * @param kategori */ public void settKategori(String kategori); /** * Setter mobiltelefonnummeret til kontakten * @param mobilTelefon */ public void settMobilTelefon(int mobilTelefon); /** * Setter hjemmetelefonnummeret til kontakten * @param hjemmeTelefon */ public void settHjemmeTelefon(int hjemmeTelefon); } Adresse Klikk for å se/fjerne innholdet nedenfor public interface Adresse { /** * Henter gatenavnet til adressen * @return String gateNavn */ public String hentGate(); /** * Henter gatenummeret til adressen * @return String gateNummer */ public String hentGateNummer(); /** * Henter postnummeret til adressen * @return int postnummer */ public int hentPostnummer(); /** * Henter byen til adressen * @return String by */ public String hentBy(); /** * Setter gatenavnet til adressen * @param gate */ public void settGate(String gate); /** * Setter gatenummeret til adressen * @param gateNummer */ public void settGateNummer(String gateNummer); /** * Setter postnummeret til adressen * @param postNummer */ public void settPostnummer(int postNummer); /** * Setter byen til adressen * @param by */ public void settBy(String by); } Der er de interfacene som følger med oppgaven. Nå skal jeg liksom lage Tre klasser som implementerer de over. Problemene oppstår på grunn av måten BinaerTre er definert på, jeg får ikke endret noe som helst i klassen som implementerer BinaerTre uten at eclipse klikker mongo. De fleste metodene i BinaerTre skal jo jobbe med Kontakt objektet eller et løv objekt, spørs jo litt hvilken vinkel jeg velger. Først skal jeg lage klassen Treet, som implementerer BinaerTre. Greit nok, da får jeg følgende klasse public class Treet implements BinaerTre<E> { public Treet() { // TODO Auto-generated constructor stub } } Hvis jeg nå høyreklikker på Treet og lar eclipse fylle ut resten av de uimplementerte metodene ender jeg opp med følgende greie: Klikk for å se/fjerne innholdet nedenfor import java.util.Iterator; public class Treet implements BinaerTre<E> { public Treet() { // TODO Auto-generated constructor stub } @Override public E finn(E data) { // TODO Auto-generated method stub return null; } @Override public int hentAntall() { // TODO Auto-generated method stub return 0; } @Override public boolean settInn(E data) { // TODO Auto-generated method stub return false; } @Override public boolean slett(E data) { // TODO Auto-generated method stub return false; } @Override public Iterator<E> iterator() { // TODO Auto-generated method stub return null; } } Her kan jeg ikke endre datatypen E i funksjonene uten at jeg bryter interfacen? Samt at E øverst i klassen (BinaerTre<E>) er en ukjent datatype? Whyyy? For de som er nysgjerrig laster jeg også opp hele oppgaven. oblig3.pdf Lenke til kommentar
steingrim Skrevet 20. april 2009 Del Skrevet 20. april 2009 Du har nok misforstått eller ikke forstått generics BinaerTre<E> er et generisk grensesnitt som betyr at det kan være et BinaerTre av hva som helst (så lenge det implementerer Comparable i dette tilfellet). Når man skal lage en konkret implementasjon må man oppgi typen: public class Treet implements BinaerTre<Kontakt> { public Treet() { // TODO Auto-generated constructor stub } @Override public Kontakt finn(Kontakt data) { // TODO Auto-generated method stub return null; } // ... } I dette tilfellet blir det å fylle ut Kontakt for E og Eclipse vil autogenerere alle metodene med korrekt signatur. Lenke til kommentar
DeadManWalking Skrevet 20. april 2009 Forfatter Del Skrevet 20. april 2009 (endret) Oh, så jeg kan angi interfacen? Jeg trodde jeg måtte lage en klasse som implementerte interfacen kontakt for å så bruke den som datatype. Hmm. *gnisegiøynene* God morgen. Tror jeg er med nå, skal teste ut med engang. Haha, det var ikke verre. Så genialt at du svarer meg rett før vekkerklokken ringer. Takk. Igjen viser deg seg at for min del hjelper det lite å gjøre dette nattestid. Sist glemte jeg to parenteser () når jeg forsøkte å jobbe nattestid. Endret 20. april 2009 av data_jepp Lenke til kommentar
serrghi Skrevet 22. april 2009 Del Skrevet 22. april 2009 Oh, så jeg kan angi interfacen? Jeg trodde jeg måtte lage en klasse som implementerte interfacen kontakt for å så bruke den som datatype. Hmm. *gnisegiøynene* God morgen. Tror jeg er med nå, skal teste ut med engang. inv_biggrin.gif Det må du vel uansett? Ettersom du har metoder i interfacen du skal bruke, og uten å ha faktisk lagd de er de vel strengt tatt ubrukelige.. Lenke til kommentar
DeadManWalking Skrevet 22. april 2009 Forfatter Del Skrevet 22. april 2009 Jo, det er sant. Tidig bare at jeg kan bruke en interface som datatype. Det har jeg fått med meg. Har laget de andre klassene også. Lenke til kommentar
Mapster Skrevet 28. april 2009 Del Skrevet 28. april 2009 Ikke for å ødelegge, men har samme oppgaven og tror man er nødt til å skrive treet slik at det også kan håndtere andre typer enn Kontakt. Hvis du leser på 2.5 Tester (JUnit) så står det at man ikke nødvendigvis trenger å teste med Kontakt som elementer, men med f. eks String. Dette kan man ikke ved å lage treet for Kontakt, så vidt jeg har forstått. Lenke til kommentar
DeadManWalking Skrevet 28. april 2009 Forfatter Del Skrevet 28. april 2009 (endret) Riktig, det er sant. Jeg har gjort det også, jeg rotet sånn første gang at jeg bare begynte om igjen. junit testene mine bruker Integer som elementer i treet. Lol, ikke to constructors. Jeg har to "settInn" hvor den ene tar node klassen min og den andre tar et objekt som implementerer comparable. Haha, jeg vet hvem du er! Endret 28. april 2009 av data_jepp Lenke til kommentar
Mapster Skrevet 28. april 2009 Del Skrevet 28. april 2009 (endret) Har endt opp med to settInn() jeg og, men det irriterer meg litt at jeg er nødt til å bruke @SuppressWarnings("unchecked") på en god del av metodene mine. edit: Men det viser seg at et trøtt hode faktisk ofte kan oppdage ting et våkent ikke kan Fant nettopp en løsning slik at jeg slipper supress warnings Endret 29. april 2009 av Mapster Lenke til kommentar
Anbefalte innlegg
Opprett en konto eller logg inn for å kommentere
Du må være et medlem for å kunne skrive en kommentar
Opprett konto
Det er enkelt å melde seg inn for å starte en ny konto!
Start en kontoLogg inn
Har du allerede en konto? Logg inn her.
Logg inn nå