Iheritace
Återavädig Två mekaismer Nedärvig av egeskaper (iheritace) Objekt kompositio A A +a +b B B
Iheritace Återavädig geom att skapa subklasser kallas ofta white box reuse Ekelt att aväda Relatioe mella objekt bestäms statiskt vid kompilerige Ka modifiera beteedet i basklasse vid behov A B
Liskovs substitutiospricip Fuktioer som aväder refereser till objekt av basklasser måste kua aväda objekt av deriverade klasser uta att märka ågo skillad Eller origial variate What is wated here is somethig like the followig property. If for each object o1 of type S there is a object o2 of type T such that for all programs P i terms of T, the behaviour of P is uchaged whe o1 is substituted for o2 the S is a subtype of T. Ett exempel för att visa betydelse...
Kvadrat och rektagel E rektagel klass class Rectagle{ public void setwidth(it w){ x=w; public void setheight(it h){ y=h; public it getwidth(){ retur x; public it getheight(){ retur y; private it x; private it y; E kvadrat är e typ av rektagel Alltså borde klass Square vara e subklass av klass Rectagle
Kvadrat och rektagel, ågra problem E kvadrat har x==y. Alltså är det oödigt att spara både x och y Ma behöver ite heller både getwidth() och getheight() Me ma får dem med ädå Det verkliga problemet är setheight och setwidth Alltid ska bevara x==y Det gör ite de uvarade implemetatioe
Hur fixa problemet? Omdefiiera setheight och setwidth class Square exteds Rectagle{ public void setheight(it h){ x=h; y=h; public void setwidth(it w){ x=w; y=w; Nu är det alltid e kvadrat Itert kosistet
Fukar det här? E fuktio som aväder e rektagel ska fugera också om ma aväder e kvadrat public void stretch(rectagle r, it legth){ r.setwidth(r.getwidth()+legth); r.setheight(r.getheight()+legth); Rektagel fugerar som vätat x =x+legth och y =y+legth Kvadrat fugerar aorluda x =x+2*legth och y =y+2*legth
Ett litet problem till class Rectagle{ public void setwidth(it w){ x=w; public void setheight(it h){ y=h; public it getwidth(){ retur x; public it getheight(){ retur y; public fial void stretch(it legth){ setwidth(x+legth); setheight(y+legth); public void shrik(it percet){... Omdefiierig av edast setheight och setwidth ka implicit omdefiiera flera metoder. Speciellt ett problem då ma ärver av klasser ma ite har källkode till
Sammafattig Ett kvadrat objekt är ite ett rektagel objekt Olika beteede Ma måste täka på hur ett objekt aväds Samma problem också med t. ex. ellips och cirkel Det här är e mycket valig typ av fel Ärvig måste avädas försiktigt Lätt att itroducera fel som är svåra att hitta
Tecke på LSP problem Fuktioaltet är borttage i subklasse public class Base{ public void f(){ /*Lite kod här*/ public void Derived exteds Base{ public void f(){ Udatag geereras av omdefiierade metoder i subklasser Me udatag gereras ite av motsvarade metoder i basklasse
LSP och kotrakt baserad desig Det fis ett sambad mella kotrakt och LSP När ma omdefiierar e metod i e subklass får ma edast försvaga förvillkoret och stärka eftervillkoret Mera matematiskt: Om P är förvillkor, Q eftervillkor och I ivariat i superklasse beteckar motsvarade i subklasse P Q' I' P' I Q
Exempel Kotrakt för setheight i klasse Rectagle /*@requires h>=0; @esures y==h && x=\old(x); @*/ public void setheight(it h){ y=h; Detta kotrakt uppfylls ite av implemetatioe av kvadrat klasse Också om kotrakte ite är explicit utskriva fis de ädå där som atagade över hur klasse är täkt att fugera
Kotrakt sammafattig Det ka vara bra att skriva ut för och eftervillkor Lättare att se vad som det är täkt att e metod ska åstadkomma LSP är iget absolut krav Me att ska skapa klasser som bryter mot pricipe ska övervägas oga
Ärvig, ackdelar Ärvig expoerar delar av implemetatioe av basklasse till subklasser Arv bryter mot pricipe om döljige av iformatio Implemetatioe av subklasse blir lätt beroede av basklasses implemetatio Förädrigar i basklasse ka resultera i förädrigar också måste göras i subklasser
Objekt kompositio Mera dyamiskt, relatioer mella objekt bestäms då programmet körs Väldefiierade grässitt behövs Java iterfaces GoF boke rekommederar Aväd hellre objekt kompositio i stället för ärvig Subklasser ofta lättare att aväda för vissa problem Delegerig
Delegerig Delegerig är e metod för att göra kompositio lika kraftfullt för återavädig som ärvig Två objekt aväds Ett objekt som tar emot e förfråga (metod arop) Ett objekt som förfråga delegeras till Samma effekt som då subklasser överlåter förfrågigar till basklasser
Delegerig, exempel Rect agle Widow +rectagle Rectagle area() area() 1 area() Widow retur rectagle.area()
Grafiska avädargrässitt Exempel javax.swig.jbutto E valig kapp frå swig biblioteket Då avädare trycker på de ska programmet utföra ågo fuktio Två möjliga alterativ för att hatera kapptryckigar Skapa e subklass av JButto klasse och omdefiiera e haterigsmetod Delegera haterige till ett speciellt haterigsobjekt
JButto (forts) Swig aväder delegerig för att hatera olika hädelser (evets) public class JButto...{... public void addactiolisteer( ActioListeer l){... public iterface ActioListeer{ void actioperformed( ActioEvet e) ;
JButto (forts.) E JButto skapas så här: class Hadler implemets ActioListeer{... void actioperformed( ActioEvet e) { //hatera kapptryckigar... ActioListeer listeer=ew Hadler(...); JButto butto = ew JButto( text ); butto.addactiolisteer(listeer); pael.add(butto);...
Exempel trådar (threads) Ett Java program ka ha måga trådar som körs parallellt Skapas geom ärvig eller delegerig public class MiThread exteds Thread{... public void ru(){ //Vad tråde ska göra... Thread t=ew MiThread(...); t.start();
Trådar (forts.) Delegerigsversio public class MiThread implemets Ruable{... public void ru(){ //Vad tråde ska göra... Ruable r=ew MiThread(...); Thread t=ew Thread( r ); t.start();
Delegerig sammafattig Samma problem som måga adra metoder för att öka flexibilitete via objekt kompositio Dyamiskt, parametriserad mjukvara är svår att förstå Möjlige också lågsammare ä subklasser Ska avädas då delegerig föreklar mera ä ökar komplexitete Fugerar bäst tillsammas med desigmöster