Objekt Orientert Programmering (OOP)
Objektorientering (OO)1/6 Objektorientering er en grunnleggende måte å organisere komplekse fenomener på
Objektorientering (OO)2/6 Norske pionerer Grunnleggere av det første objektorienterte dataspråk, Simula: Kristen Nygaard og Ole-Johan Dahl. Nobel Prize of Computing: A. M. Turing Award
Objektorientering (OO)3/6 SQLWindows eksempel Klassen clsDataField er tillagt egenskapen magenta bakgrunnsfarge.
Objektorientering (OO)4/6 Flash eksempel Klassen Joystick inneholder et grensesnitt som forteller om joystickens posisjon (x,y) og vinkel. Klassen Car leser Joystickens data for å orientere seg om sin videre bevegelse
Objektorientering (OO)5/6 KlasseDeklarasjon av data + operasjoner på ‘gjenstander’ av en gitt type ObjektEn forekomst (variabel) av en klasse Klasse Objekt Abstrakt nivå Fysisk nivå
Objektorientering (OO)6/6 Data Ansatt Nr Navn Adresse Tlf... Metoder Add_AnsNr Add_Navn Add_Adress Add_Tlf Get_AnsNr BeregnLonn... 3 Nilsen Storgt Hansen Havnegt Olsen Reinv Data gir duplikater for hvert objekt Metodene deles av objektene Klassen Ansatt Objekt 2Objekt 3Objekt 1
Objektorientert programmering (OOP) La objektene ta hånd om seg selv (intern struktur,...). Kommuniser med objektene via et grensesnitt som er uavhengig av intern struktur i objektene. Objekt Grensesnitt Melding
class / object class B { private var owner :Object; private var x :Number; public function A(owner:Object) { this.owner = owner; } public function set_x(x:Number){ this.x = x; } public function get_x() :Number{ return x; } class A { private var b :B; ….. public function make_B( ) { b = new B(this); } ….. }
Klassemedlemmer class A{// klasse A private var owner :Object; private var x :Number;// attributt x public A(owner:Object) {// konstruktør this.owner = owner; } public setX(x:Number) {// accessor this.x = x; } public getX( ) :Number {// mutator return x; }
Aksesskontroll1/4 privateTilgang kun av klassen selv protectedTilgang kun av klassen selv samt arvede klasser publicTilgang av alle Tilgang innenfor gjeldende pakke
Aksesskontroll2/4 private:Strengeste aksess-kontroll. Kun funksjoner i klassen selv kan aksessere et private klasse-medlem. Avledede klasser eller forekomster har ingen aksess til private medlemmer i en parent-klasse. protected:Kun klassen selv eller avledede klassers funksjoner har aksess til protected medlemmer. Forekomster har ingen aksess til protected medlemmer. public:Medlemmer deklarert vha public har man ubegrenset aksess til, dvs public medlemmer kan aksesseres av en hvilken som helst funksjon.
Aksesskontroll3/4 ä Attributter skal skjules for brukeren av klassen. ä Brukeren av klassen skal ikke ha tilgang til informasjon om klassens interne struktur. ä Brukeren skal benytte en protokoll til klassen. - Brukeren sender meldinger til objektet. - Brukeren kaller metodene. Informasjons-skjuling Nr Navn Init GetNr GetNavn
Aksesskontroll4/4 Base Class Derived Class Other Class or Object private protected public
Arv-Base class / Derived class A B Base class Derived class
Arv-Eksempel Person Ansatt Selger Navn Fødselsdato Navn Fødselsdato Avdeling Timelønn Beregning av lønn Navn Fødselsdato Avdeling Timelønn Beregning av lønn Salgsdistrikt Bonus Arvet fra Person Arvet fra Ansatt
Arv-Klassehierarki Transportmiddel Sykkel Bil Tog Fly Trehjul- sykkel Trehjul- sykkel Tandem Person- bil Person- bil Laste- bil Laste- bil
Arv - Akesess-kontroll 1 Private 2 Protected 3 Public Base class A 2 Protected 3 Public Derived class B Derived class C Forekomst av B
Arv - Klassehierarki-diagram Concrete classAbstract class Interface extends Interface extends Interface implements Concrete class extends Concrete class
Arv - main
Arv - class A / class B (1/2) class A { private var x :Number; ….. public function A( ) { this.x = 0; } public function set_x(x:Number) { this.x = x; public function get_x( ) :Number { return x; } class B extends A { private var y :Number; public function B( ) { super(); this.y = 0; } public function set_y(y:Number) { this.y = y; } public function set_xy(x:Number, y:Number) { set_x(x); this.y = y; } public function get_y( ) :Number { return x; }
Arv - class A (2/2)
Arv - class B extends A (1/2)
Arv - class B extends A (2/2)
Arv og polymorfi public class A{ public f (…) { … } public class B extends A { public f (…) { … } A B A a = new A(…) a.f(…) // eksekverer A sin f B b1 = new B(…) A b2 = new B(…) b1.f(…) // eksekverer B sin f b2.f(…)// eksekverer B sin f
PolymorfiFigur (getAreal) Figur getAreal..... Trekant getAreal..... Sirkel getAreal..... Figur s = new Sirkel(…) s.getAreal( )
PolymorfiFigur (flytt) Figur flytt TrekantSirkel Figur s = new Sirkel(…) s.flytt( ) skjul nyeKoord vis skjul vis skjul vis
Interface - Abstrakte klasser main
Interface - Abstrakte klasser interface I_A
Interface - Abstrakte klasser abstract class A_A (1/2)
Interface - Abstrakte klasser abstract class A_A (2/2)
Interface - Abstrakte klasser class A
Indre klasser (non-static) public class A{ int y; public class B {// B eksisterer kun innenfor A int x; void f( ) { …// this refererer til B …// A.this refererer til A } B kan instantieres kun av en ikke-statisk metode innenfor A. B kan aksessere alle medlemmer av A og B direkte.
Indre klasser (static) public class A{ int y; public static class B {// B kan eksistere alene int x; void f( ) { …// this refererer til B …// A.this refererer til A } B kan eksistere alene (uten A-forekomst)og kan instantieres ved A.B b = A.B( ). Deretter kan f eksekveres ved b.f( ). B kan kun aksessere static medlemmer av A.
Indre klasser - main
Indre klasser - class A (1/3)
Indre klasser - class A (2/3)
Indre klasser - class A (3/3)
ENDEND
Parameteroverføring Overføring av primitive typer. Pass by value. Overføring av referense typer. Pass by reference. x :Number = 3 f(x) f(y:Number) 3 3 x y x :A f(x) f(y:A). x y
Program-struktur Flash var sim:Sim = new Sim(this); class Sim { private var mc :MovieClip; public function Sim(mc:MovieClip) { this.mc = mc; init(); } ….. } class Sim_X extends Sim { private var a :A; private var b :B; private var mc_A :MovieClip; private var mc_B :MovieClip; public function Sim_X(mc:MovieClip) { super(mc); init_X(); } private funcion init_X() { var d:Number = 0; mc_A = mc.createEmptyMovieClip(”mc_A”,++d); ….. } public function make_A() { a = new A(this,mc_A); } ….. }
Program-struktur class A { private var owner :Object; private var mc :MovieClip; public function A(owner:Object, mc:MovieClip) { this.owner = owner; this.mc = mc; init( ); } ….. }