< T extends Comparable<T> > Indre klasser mm. «Det du bør ha hørt om før oblig 4»
Strukturen i oblig 3 null null null null Personbeholder pl null null Person p "Adnan" michael@ifi.uio.no INF1010 21. februar 2013 (uke 8) 2
Personbeholder uten generisk parameter Person Person Personbeholder første p p pb class PersonBeholder { private første ; class { Person p ; ; ( Person ) { p = ; michael@ifi.uio.no INF1010 21. februar 2013 (uke 8) 3
Indre klasser class PersonBeholder { private første ; class { Person p ; ; ( Person ) { p = ; Klasser i Java kan defineres inni hverandre Objekter i den indre klassen kan referere til metoder og variable i sitt omsluttende ekt + Lettvint + Skjuler implementasjon Flere feilmuligheter PersonBeholder. ytreknute = allepersoner. første. ; ytreknute. p. skrivutmegogvenner ( " " ) ; michael@ifi.uio.no INF1010 21. februar 2013 (uke 8) 4
Indre klasser class PersonBeholder { første ; class { Person p ; ; ( Person ) { p = ; Klasser i Java kan defineres inni hverandre Objekter i den indre klassen kan referere til metoder og variable i sitt omsluttende ekt + Lettvint + Skjuler implementasjon Flere feilmuligheter PersonBeholder. ytreknute = allepersoner. første. ; ytreknute. p. skrivutmegogvenner ( " " ) ; Du må opprette et ekt av den ytre klassen før du får lov til å lage ekter av den indre klassen michael@ifi.uio.no INF1010 21. februar 2013 (uke 8) 5
Indre klasser og innkapsling class PersonBeholder { private første ; private class { Person p ; ; ( Person ) { p = ; Innkapsling n alltid ønskelig + Reduserer feilmuligheter + Lettere å forstå programmer OBS! private gir heller ikke tilgang i subklasser protected gir michael@ifi.uio.no INF1010 21. februar 2013 (uke 8) 6
Indre klasser og innkapsling class PersonBeholder { protected første ; protected class { Person p ; ; ( Person ) { p = ; Innkapsling n alltid ønskelig + Reduserer feilmuligheter + Lettere å forstå programmene OBS! private gir heller ikke tilgang i subklasser protected gir subklasseadgang michael@ifi.uio.no INF1010 21. februar 2013 (uke 8) 7
Personbeholder uten generisk parameter Person Person Personbeholder første p p pb class PersonBeholder { private første ; private class { Person p ; ; ( Person ) { p = ; michael@ifi.uio.no INF1010 21. februar 2013 (uke 8) 8
Beholder med generisk parameter T T Beholder<Person> første inf1010stud class Beholder<T> { private første ; private class { T ; ; (T ) { = ; Beholder<Person> inf1010stud = new Beholder<Person > ( ) ; Kan vi få tak i personegenskapene i beholderen? Hva vet vi om T inne i beholderektet? michael@ifi.uio.no INF1010 21. februar 2013 (uke 8) 9
Hva vet vi om T? Object Object Beholder<Person> første inf1010stud class Beholder<T extends Object> { private første ; private class { T ; ; String navn = (T ) { = ; Beholder<Person> inf1010stud = new Beholder<Person > ( ) ; Hva er typen til variabelen T? Svar: Vi kjenner Object-egenskapene! I figuren den ikke-skyggelagte delen av personektene. michael@ifi.uio.no INF1010 21. februar 2013 (uke 8) 10
Noen av metodene i Object protected Object clone ( ) // Creates and returns a copy of this ect. boolean equals ( Object ) // Indicates whether some other ect is «equal to» this one. Class<?> getclass ( ) // Returns the runtime class of this Object. int hashcode ( ) // Returns a hash code value for the ect. String tostring ( ) // Returns a string representation of the ect. kopiert fra http://docs.oracle.com/javase/7/docs/api/java/lang/object.html michael@ifi.uio.no INF1010 21. februar 2013 (uke 8) 11
Beholder for ekter med personegenskaper Person Person Beholder<Student> første inf1010stud class Beholder<T extends Person> { private første ; class Student extends Person {... private class { T ; ; (T ) { = ; Beholder<Student> inf1010stud = new Beholder<Student > ( ) ; Hvorfor ikke bare si <Person T>? Fordi vi også kan bruke subklasser av Person som aktuell parameter. michael@ifi.uio.no INF1010 21. februar 2013 (uke 8) 12
Beholder for ekter med personegenskaper Person Person Beholder<Student> første inf1010stud class Beholder<T extends Person> { private første ; private class { T ; ; class Student extends Person {... Beholder<Student> inf1010stud = new Beholder<Student > ( ) ; (T ) { = ; Men nå er vi n tilbake til personbeholderen igjen. Hva om vi bare trenger noen få personegenskaper, f.eks. hentnavn()? michael@ifi.uio.no INF1010 21. februar 2013 (uke 8) 13
Beholder for ekter som har metodene i grensesnittet HarNavn HarNavn HarNavn Beholder<Student> første inf1010stud Objects metoder pluss hentnavn() tilgjengelig i disse ektene class Beholder<T implements HarNavn> { private første ; private class { T ; ; (T ) { = ; interface HarNavn{ String hentnavn ( ) ; class Person implements HarNavn {.... class Student extends Person {... Beholder<Student> inf1010stud = new Beholder<Student > ( ) ; her har ektet peker på Object-metoder pluss metoden definert i HarNavn. Legg merke til typen til i figuren! michael@ifi.uio.no INF1010 21. februar 2013 (uke 8) 14
Beholder for ekter som har metodene i grensesnittet HarNavn HarNavn HarNavn Beholder<Student> første inf1010stud Objects metoder pluss hentnavn() tilgjengelig i disse ektene class Beholder<T extends HarNavn> { private første ; private class { T ; ; (T ) { = ; interface HarNavn{ String hentnavn ( ) ; class Person implements HarNavn {.... class Student extends Person {... Beholder<Student> inf1010stud = new Beholder<Student > ( ) ; her har ektet peker på Object-metoder pluss metoden definert i HarNavn. Legg merke til typen til i figuren! michael@ifi.uio.no INF1010 21. februar 2013 (uke 8) 15
Beholder for sammenlignbare ekter Sammenlignbar Sammenlignbar Beholder<Student> første inf1010stud class Beholder<T extends Sammenlignbar> { private første ; private class { T ; ; (T ) { = ; interface Sammenlignbar { class Person implements Sammenlignbar {.... class Student extends Person {... Beholder<Student> inf1010stud = new Beholder<Student > ( ) ; Grensesnittet skal inneholde en metode som gjør at vi kan sammenligne ekter av klasser som implementerer Sammenlignbar michael@ifi.uio.no INF1010 21. februar 2013 (uke 8) 16
Beholder for sammenlignbare ekter Comparable<T> Comparable<T> Beholder<Student> første inf1010stud class Beholder<T extends Sammenlignbar> { private første ; private class { T ; ; (T ) { = ; interface Sammenlignbar { class Person implements Sammenlignbar {.... class Student extends Person {... Beholder<Student> inf1010stud = new Beholder<Student > ( ) ; Dette grensesnittet er allerede laget i Java. Det heter Comparable<T>. michael@ifi.uio.no INF1010 21. februar 2013 (uke 8) 17
Grensesnittet Comparable<T> interface Comparable <T> { int compareto (T ) ; class Person implements Comparable<Person> { // andre personegenskaper... public int compareto ( Person b) {.... «compareto returns a negative, zero or a positive integer as this ect is less than, equal to, or greater than the specified ect» a.compareto(b) > 0 hvis a > b = 0 hvis a = b < 0 hvis b > a michael@ifi.uio.no INF1010 21. februar 2013 (uke 8) 18
Beholder for sammenlignbare ekter Comparable<Person> Comparable<Person> Beholder<Person> første inf1010stud int compareto(person p) int compareto(person p) class Beholder<T extends Comparable<T>> { private første ; private class { T ; ; (T ) { = ; class Person implements Comparable<Person> { public int compareto( Person p) {... class Student extends Person {... Beholder<Student> inf1010stud = new Beholder<Student > ( ) ; Sett fra Beholderen (ved kompilering) har personektene compareto-metoden pluss metodene michael@ifi.uio.no INF1010 21. februar 2013 (uke 8) fra Object 19
Beholder for sammenlignbare ekter Comparable<Person> Comparable<Person> Beholder<Person> første inf1010stud int compareto(person p) int compareto(person p) class Beholder<T extends Comparable<T>> { private første ; private class { T ; ; (T ) { = ; class Person implements Comparable<Person> { public int compareto( Person p) {... class Student extends Person {... Beholder<Student> inf1010stud = new Beholder<Student > ( ) ; Sett fra Beholderen (ved kompilering) har personektene compareto-metoden pluss metodene michael@ifi.uio.no INF1010 21. februar 2013 (uke 8) fra Object 20
Metoden compareto(t ) int compareto(person p ) return this.pnr p.pnr; String navn int 34659 pnr int compareto(string s) «Inga» int compareto(person p ) return this.pnr p.pnr; Person enperson String navn int 72788 pnr int compareto(string s) «Ask» Person enperson = new Person ( "Ask", 72788); int cmpto = enperson.compareto(new Person ( " Inga ", 34659)); Hva blir verdien til cmpto? michael@ifi.uio.no INF1010 21. februar 2013 (uke 8) 21
Metoden compareto(t ) int compareto(person p ) return navn.compareto(p.navn); String navn int 34659 pnr int compareto(string s) «Inga» Person enperson int compareto(person p ) return navn.compareto(p.navn); int String 72788 navn pnr int compareto(string s) «Ask» Person enperson = new Person ( "Ask", 72788); int cmpto = enperson.compareto(new Person ( " Inga ", 34659)); Hva blir verdien til cmpto? michael@ifi.uio.no INF1010 21. februar 2013 (uke 8) 22
Klassestrukturen i oblig 4 class Oblig4 { public static void main( String [ ] a ) { new Testklasse ( ) ; class Testklasse { // test- og hovedprogram interface INF1010samling<K, V> { // metoder beholderen skal ha class SELLbeholder<N extends Comparable<N>, O > implements INF1010samling<N, O > { // Sortert enkeltlenket lenkelistebeholder class Person { // Eksempel på klasse hvis ekter kan legges i beholderen class Ord implements Comparable<Ord> { // Eksempel på klasse hvis ekter kan brukes som nøkkel Husk: String implementerer Comparable<String>. michael@ifi.uio.no INF1010 21. februar 2013 (uke 8) 23