Objektorienterad Programmering (TDDC77) Föreläsning X: Klass diagram, inkapsling, arv Ahmed Rezine IDA, Linköpings Universitet Hösttermin 2016
Outline Introduktion HT2 Åtkomst Abstrakt datatyp UML Överlagring (overloading) Inkapsling (encapsulation) Arv (inheritance)
Outline Introduktion HT2 Åtkomst Abstrakt datatyp UML Överlagring (overloading) Inkapsling (encapsulation) Arv (inheritance)
Vad händer under HT2 I Klasser och objekt (classes and objects) I Inkapsling och arv (encapsulation and inheritance) I Åsidosättning och överlagring (overriding and overloading) I Abstrakta klasser och gränssnitt (abstract classes and interfaces) I Samlingar (collections), generics I Uppräkningar (enumerations) I Undantag (exceptions)
Laborationsserie del två lab 4: Två små uppgifter (kom igång) lab 5: Multiplikationstabell (arv versus inkapsling) lab 6: Dictionary (Samling, generics) lab 7: Menysystem (Objekthierarkier, abstrakta klasser)
Miniprojekt I Som avslutning genomförs ett miniprojekt. Det finns förslag på projekt på kurshemsidan I Det är tillåtet att komma med egna projektförslag, man får då skriva motsvarande projektbeskrivning själv. Denna ska godkännas av mig innan projektet börjar.
Datorbaserat tenta I Ett individuellt datorbaserat prov med live rättning I Där ni ska lösa ett antal problem I Tentan är planerat för den 2015-01-10 kl 14-18.
Tenta förberedelse I Programmera, Kör, förstå och prova på med alla exemplen som vi tar under föreläsningar, I Samma för labbarna och projektet I Prova lösa förra årets tentan: det blir samma svårighets grad
Ett objekt Identitet Tillstånd Tjänster
Ett objekt Typ och referens Variabler Metoder
Calculator class CalculatorDriver { public static void main ( String [] args ){ Calculator calc1 = new Calculator (); Calculator calc2 = new Calculator (); System.out. println (" calc1 +5 : " + calc1.add (5)); System.out. println (" calc2 +10: " + calc2.add (10)); System.out. println (" calc1 = " + calc1.add (0)); System.out. println (" calc2 = " + calc2.add (0)); class Calculator { private double result ; public Calculator (){ result = 0; public double add ( double a){ result = result + a; return result ; public double reset (){ result = 0; return result ;
Ett objekt (typ: Calculator) calc1, calc2 (result) 10 double add(double), void reset()
Outline Introduktion HT2 Åtkomst Abstrakt datatyp UML Överlagring (overloading) Inkapsling (encapsulation) Arv (inheritance)
Åtkomst I I Java finns fyra åtkomstnivåer för variabler och funktioner I public : alltid synlig I protected: tas upp senare I default (package): tas upp senare I private: endast synlig inom klassen I i den här kursen håller vi oss till public och private
Åtkomst grundregel I Deklarerar alla variabler som private I Deklarerar alla funktioner som public I Detta bettyder att om man vill kunna läsa/skriva en variabel från en annan klass så måste man göra funktioner som utför det. Detta kallas för getters och setters och eclipse kan generera den automatiskt I Det finns undantag, men dessa kommer ni att lära er att känna igen så småningom I Konstruktorer bör vara deklarerade som public
Outline Introduktion HT2 Åtkomst Abstrakt datatyp UML Överlagring (overloading) Inkapsling (encapsulation) Arv (inheritance)
Abstrakt datatyp I Ibland vill man behandla data på ett sätt som inte riktigt stämmer med de primitiva datatyperna. I Man måste då kombinera ihop en ny datatyp som är anpassad för det man faktiskt vill göra med den I Ett exempel på detta är stacken som ni implementerade till lincalc I En abstrakt datatyp är ofta en kombination av variabler (tillstånd) och funktioner (tjänster)... I... det låter som att abstrakta datatyper och klasser har en del gemensamt
Öva - gör om stacken som en klass I Skapa en klass StringStack som kan lagra 100 strängar I Strängarna ska lagras i en Array som det inte ska gå att ändra i så att stacken hamnar i ett otillåtet tillstånd I Ska klara operationerna push, pop och isempty
StringStack public class StringStack { private static int MAX = 100; private String [] data = new String [ MAX ]; private int pos = 0; public boolean isempty (){ return pos == 0; public void push ( String s){ data [ pos ++] = s; public String pop (){ return data [-- pos ];
Outline Introduktion HT2 Åtkomst Abstrakt datatyp UML Överlagring (overloading) Inkapsling (encapsulation) Arv (inheritance)
UML I UML = Unified Modeling Language I En enorm standard för att modellera precis allt I En liten del kallas för klass-diagram och beskriver hur klasser hänger ihop med varandra I Vi kommer i kursen att använda en mycket begränsad delmängd av dessa klass-diagram kallad Lättviktsdiagram
Lättviktsdiagram I De som ska rätta era uppgifter behöver förstå era design och vill därför ha diagram som beskriver era klasser och relationerna dem emmellan I Ni behöver inte göra formellt korrekta UML-diagram
Klassen calculator class Calculator { private double result ; result: double Calculator Calculcator() Calculcator(double) add(a: double): double add(a: double, b: double): double reset():void public Calculator (){ result =0; public double add ( double a){ result += a; return result ; public void reset (){ result = 0;
Klasser I Klasser ritas som tredelade rutor I Översta rutan innehåller klassnamnet I Därefeter följer attribut (alltså variabler) I Understa rutan innehåller metoderna attribut1namn : attribut1typ attribut2namn : attribut2typ... KlassNamn metod1namn(param1namn: param1typ,...) : returtyp1...
Outline Introduktion HT2 Åtkomst Abstrakt datatyp UML Överlagring (overloading) Inkapsling (encapsulation) Arv (inheritance)
Klassen calculator class Calculator { private double result ; memory: double result: double Calculator Calculator() Calculator(mem: double) add(a: double): double add(a: double, b: double): double store():void load():void public Calculator (){ result = 0; public Calculator ( double mem ){ result = mem ; public double add ( double a){ result += a; return result ; public double add ( double a, double b){ result = a + b; return result ; public void reset (){ result = 0;
Signatur public static int parseint ( String s) throws NumberFormatException I En konkret metod deklareras med hjälp av sex komponenter I Accessmodifierare såsom public och protected I Returtyp eller void I Metodens namn (identifierare) som ska börja med liten bokstav I Parameterlista med noll eller fler datatyper och identifierare I Eventuella checked exceptions som metoden kastar I Metodens kropp inom måsvingar I Metodens signatur betäms av metodens namns samt datatyper och ordning på parameterlistan
Överlagring I En metod överlagrar en annan om den har samma namn (identifierare) men olika signatur I Returtyp spelar ingen roll för överlagring vilket innebär att två metoder med olika returtyp men samma signatur inte är tillåtet (kompilatorn kan inte skilja på dem).
Outline Introduktion HT2 Åtkomst Abstrakt datatyp UML Överlagring (overloading) Inkapsling (encapsulation) Arv (inheritance)
Inkapsling (encapsulation)
Inkapsling (encapsulation) public private variabler bryter mot inkapsling verkställer inkapsling metoder tjänster till andra klasser hjälpar egna metoder
Personnummer class Personnummer { private int year, month, day, birthnumber, controlnumber ; public Personnummer ( String str ){ year = Integer. parseint (str. substring (0,4)); month = Integer. parseint (str. substring (4,6));... public void set_year ( int _year ){ year = _year ; public void set_month ( int _month ){ month = _month ;... public int getyear (){ return year ; public int getmonth (){ return month ;...
Employee class Employee { private Personnummer personnummer ; public Personnummer getpersonnummer (){ return personnummer ; public void readdata () { Scanner in = new Scanner ( System. in ); System. out. println (" Personnummer?"); personnummer = new Personnummer ( in. nextline ());
Driver class Driver { public static void main ( String [] args ){ Employee e = new Employee (); e. readdata (); System. out. println (" The employee was born on: " + e. getpersonnummer (). getyear () );
Inkapsling (encapsulation) anställd år personnummer Tjänster månad dag Tjänster...
Inkapsling (encapsulation)
Inkapsling (encapsulation) public private variabler bryter mot inkapsling verkställer inkapsling metoder tjänster till andra klasser hjälpar egna metoder
Inkapsling (encapsulation) I Anta att klass A kapslar in klass B. Detta illustreras genom att ett streck ritas från A till B, samt att en ifylld romb ritas vid A, alltså den klass som kapslar in den andra.
Inkapsling (encapsulation) I Student inkapslar Studiemedelw name: String Student isregistred(semester:semester):boolean register(semester:semester):void getname(): String Studiemedel
Outline Introduktion HT2 Åtkomst Abstrakt datatyp UML Överlagring (overloading) Inkapsling (encapsulation) Arv (inheritance)
Arv (inheritance) I Är en relation class Student { private int points ; private Studiemedel studiemedel ; class ITare extends Student { private int pointsdatavetenskap ;
Arv (inheritance) Superklass Subklass
Protected eller getters och setters I Vill man komma åt instansvariabler i basklassen så fungerar inte det om de är deklarerade som private. I Lösning: deklarera som protected : som private men synlig i subklasser I Bättre lösning: använd getters och setters
Att prata om arv I Subklasser ärver tillstånd och tjänster från superklasser I Ett sätt att dela på gemensam kod I En subklass utöker eller specialiserar sin superklass I En subklass är en subtyp till superklassens datatyp I En superklass kan ha flera subklasser
Arv (inheritance) I Antag att klass B ärver från klass A. Detta illustreras genom att en icke ifylld pil ritas från B till A name: String studiemedel: Studiemedel Student isregistered(semester:semester): boolean register(semester:semester):void getname(): String ITare Dare Uare
Polymorfism via Arv (inheritance) name: String Animal Animal(_name: String) getname(): String says(): String Dog Dog(_name: String) Cat Cat(_name: String) Animal hunden = new Dog (" bobby "); Animal katten = new Cat (" kitty "); System.out. println ( hunden. getname () + " says " + hunden.says ()); System.out. println ( katten. getname () + " says " + katten.says ());