Datalogi OB, Efterår 2002 OH er, forelæsning 10/ Klasser og nedarvning

Relaterede dokumenter
Klasser og nedarvning

Polymorfi. Arv (inheritance) Abstrakte klasser, substitutionsprincippet, overriding, statisk og dynamisk type. Coercion

Ugeseddel 4 1. marts - 8. marts

DANMARKS TEKNISKE UNIVERSITET

AAU, Programmering i Java Intern skriftlig prøve 18. maj 2007

University of Southern Denmark Syddansk Universitet. DM503 Forelæsning 11

b) Udvid din implementation af forme til at understøtte.equals. To objekter af samme form er ens hvis de har samme værdier i felterne.

Tree klassen fra sidste forelæsning

Forelæsning Uge 6 Mandag

Eksempel: Skat i år 2000

class subklasse-navn extends superklasse-navn { } NorwaySpruce har superklassen Spruce, som igen har superklassen Tree.

Forelæsning Uge 12 Torsdag

Forelæsning Uge 4 Mandag

Skriftlig eksamen i Datalogi

Objektorienteret design med arv og polymorfi:

Forelæsning Uge 12 Mandag

Forelæsning Uge 5 Mandag

Software Construction 1 semester (SWC) Spørgsmål 1

Forelæsning Uge 3 Mandag

Forelæsning Uge 5 Mandag

Stakke, køer og lidt om hægtede lister - kapitel 16 og 17

Datalogi OB, Efterår 2002 OH er, forelæsning 3/ forstå datastrukturer og algoritmer (teoretisk forståelse og intuition)

Forelæsning Uge 4 Mandag

Forelæsning Uge 3 Torsdag

Forelæsning Uge 3 Mandag

Forelæsning Uge 4 Mandag

Skriftlig eksamen i Datalogi

SWC eksamens-spørgsmål. Oversigt

Forelæsning Uge 3 Mandag

University of Southern Denmark Syddansk Universitet. DM502 Forelæsning 3

Forelæsning Uge 3 Torsdag

Forelæsning Uge 3 Mandag

Objektorienteret Programmering

Forelæsning Uge 2 Torsdag

Abstrakte datatyper C#-version

Kursus i OOP og Java. Kursus i Objektorienteret programmering i Java

Software Construction 1. semester (SWC) januar 2014 Spørgsmål 1

Forelæsning Uge 5 Mandag

Træer. Datastrukturer & Algoritmer, Datalogi C Forelæsning 9/

Forelæsning Uge 2 Torsdag

Søgetræer: Generel repræsentation af (sorterede) mængder og funktioner Databasesystemer...

University of Southern Denmark Syddansk Universitet. DM502 Forelæsning 4

Forelæsning Uge 2 Torsdag

Design by Contract Bertrand Meyer Design and Programming by Contract. Oversigt. Prædikater

dintprog Manual Revision: 1241 August 24, 2010 I Introduktion 3 1 Notation 3 II Begreber 4 2 Grundbegreber om programmering 4

Forelæsning Uge 4 Torsdag

Prioritetskøer ved»heap«, simulering

DM01 DM Obl. Afl. Jacob Christiansen, , D12, Elias 18/ Side 1 af 11

Stakke, køer og lidt om hægtede lister

public Set(int size) { this.listelement = new LinkedList<Integer>(); }

Forelæsning Uge 4 Torsdag

Sekvenser af længde mellem 1 og 4 ord repræsenteres ved en klasse Segment, som uden grundlæggende ser således ud:

Hashing og hashtabeller

Forelæsning Uge 5 Mandag

A Profile for Safety Critical Java

Forelæsning Uge 2 Mandag

4 Basal Objekt-orienteret Programmering I.

class Time { int hours, min; } } Time t1; // Erklær variabel af type Time class Time1 { public static void main(string[] args) { Time t1; t1.

Forelæsning Uge 1 Torsdag

Videregående Programmering for Diplom-E Noter

Videregående programmering i Java

Crash Course i Programmering. HumTek, RUC

Objekt-orienteret programmering uden klasser: Self.

Skriftlig eksamen i Datalogi

Forelæsning Uge 1 Torsdag

DM507 Algoritmer og datastrukturer

Java Klasse nedarvninger

Forelæsning Uge 6 Mandag

Videregående programmering i Java

Vejledende løsninger

Objektorienterede metoder

Hashing og hashtabeller

DM507 Algoritmer og datastrukturer

Om binære søgetræer i Java

Forelæsning Uge 4 Torsdag

Hvad er Objekter - Programmering

Klasser og objekter. (Afsnit i manualen)

Løsning af møntproblemet

DM507 Algoritmer og datastrukturer

Forelæsning Uge 2 Torsdag

Forelæsning Uge 3 Torsdag

Forelæsning Uge 6 Mandag

University of Southern Denmark Syddansk Universitet. DM502 Forelæsning 6

30 Objekt-orienteret Programmering i Andre Sprog.

Skriftlig eksamen i Datalogi

Singleton pattern i C#

Tabelbegrebet. Klassediagrammer (III) Oversigt. Anvendelse af Tabeller. Tabeller og qualified associations

Bits, bit operationer, integers og floating point

Introduktion til ActionScript, fortsat

29 Opsamling af Objekt-orienteret Programmering.

University of Southern Denmark Syddansk Universitet. DM502 Forelæsning 2

Aritmetiske Forelæsning Pr ogrammering operatorer tir 1999 sda præcedens september 1999 Logiske Sammenligningsoperatorer operatorer præcedens

Opfølgning på Dygtig Skildpadde (Michael) To algoritmeskabeloner

Udvidelse og specialisering. Klassehierarkier. Nedarvningsterminologi. Interfaces. Statiske og dynamiske typer. Polymorfi. Abstrakte klasser.

BRP Kursusintroduktion og Java-oversigt

Opgaver til C# - Beregninger og udskrift til skærm

COMPUTERSPIL 1. Opgave 1

DATALOGI 0GB. Skriftlig eksamen tirsdag den 6. januar 2004

Rekursion og dynamisk programmering

Forelæsning Uge 3 Torsdag

Transkript:

Datalogi OB, Efterår 2002 OH er, forelæsning 10/9-2002 Klasser og nedarvning Hvad er formålet? Typer, generisk kode, typeparameterisering Kritisk kig på, hvordan man gør i Java. Eftermiddagens opgave: Designe, implementere, diskutere klassehierarki

Formål klasser og nedarvning (bl.a.): - at kunne genbruge kode (generisk, parameteriseret ) - at beskytte data mod uautoriseret tilgang til repræsentation o uautoriserede ændringer => ødelægger (måske) korrekhed o uautoriserede læsninger => ødelægger modularitet: o Hvis repræsentation ændres duer program ikke :( Hvis repræsentation ændres duer program ikke :( - sikkerhed: compiler finder så mange fejl som muligt, o f.eks. forkert operationer på forkerte slags data, o forkerte slags data i forkerte slags variable) Generisk kode (kode = klasser/metoder/datatyper...): - kode som kan anvendes på forskellige (men men beslægtede ) datatyper - kræver kraftige parameteriseringsmekanismer eller nedarvning

Eksempler på, hvad vi ikke kan i Java: void sortér(type T)( T [] array data, boolean (T x, T y) ) // T er en typeparameter {... } a = sorter(int)(new integer [] {12,87,435,2,-17,76}) class Set_of(type T) // T er en typeparameter { public void insert(t) {...} public T get {...} } s Set_of(Set_of(BlaBla)) = new Set_of(Set_of(BlaBla)) Hvis vi kunne noget-i-den-retning i Java undgik vi: - at benytte den generelle klasse Object - eksplicit definitioner af specialiserede klasser hele tiden og så igen!

Generelle/generiske ting (klasser, metoder i klasser, interface) i Java: - enhver klasse/metode som ikke er final - en abstrakt klasse (pr. def klasse med abstrakte metoder) - interface (en slags totalt abstrakt klasse definition) Brug af generelle/generiske ting : - specialisering med nye eller andre egenskaber - Nedarvning med mindre andet er nævnt, overtager specialiseringen egenskaber fra det generelle Generel syntax i Java class KlasseNavn {egenskaber} class KlasseNavn extends Navn1 {nogle nye egenskaber} interface InterFaceNavn {navne-på-egenskaber} class KlasseNavn implements InterFaceNavn1, InterFaceNavn2,... {udfylde egenskaber} Princip: Erklæring af klasse eller interface skaber ny type referencer til objekter i klasse, værdier (= referencer til objekter) skabes ved new Princip: specialisering skaber undertyper. Hvor T kan bruges kan undertype of T også! Designproblem i Java: simple typer og klasser er ikke helt kompatible (kommer vi til)

Til design af sprog (som Java) med klasser og nedarvn. hører konventioner for/syntax for: - hvilke navne kan ses hvor ( hvilke egenskaber kan refereres) o når et objekt benyttes o når en klasse specialiseres - eller omvendt, når der står x i en programtekst, hvilken (om nogen) egenskab refereres til? - hvordan løses navnekonflikter (flere ting kaldet x ) - hvor stor grad af overloading tillades? Hvad er et navn Java? navn på variabel eller klasse signatur: metode-navn(parameter-type1,... ) obs: resultattype ikke en del af signaturen Java benytter signatur til at identificere metode int f(); {return 5} og float f(); {return 7.7} har samme signatur float f(float x) har en anden signatur Reference til f afgøres så vidt mulig statisk; hvis flere lige gode muligheder afgøres det dynamisk. (U)synlighed kontrolleres i Java ved: static, final, abstract, public, protected,... (læs selv hvis I ikke kan dem allerede)

Særligt problem ved multipel nedarvning Følgende kan man ikke i Java: class A {public int f(); {return 5}...}; class B {public int f(); {return 7} ;...} class C extends A,B {...} new A,B().f() ==??? // hvad for en f??? Problem kunne løses med ekstra syntaks bla.f of A() eller bla.f of B() Noget der minder om multipel nedarvning kan opnås ved at implementere flere interfaces: - der må ikke være overlappende signaturer med forskellig resultat-type i forskellige interfaces som kombineres - class AB extend IF1, IF2 {... kun én metode for hver signatur+resultat}... resten af forelæsning: lidt mere detaljer om hvordan det ser ud i Java.

Eksempel på overloading (konstruktører) public class Point { private double x, y; public Point() { x = 0.0; y = 0.0; } public Point(double x, double y) { this.x = x; this.y = y; } }...

Eksempel på overloading; metoder public class Point { private double x, y; //... public double distance(point other) { double dx = this.x - other.x, dy = this.y - other.y; return Math.sqrt(dx*dx + dy*dy); } } public double distance(double x, double y) { double dx = this.x - x, dy = this.y - y; return Math.sqrt(dx*dx + dy*dy); }

Eksempel på nedarving public abstract class Shape { public abstract double area( ); public abstract double perimeter( ); public double semiperimeter( ) {return perimeter( ) / 2; }}

public class Circle extends Shape { public Circle( double rad ) {radius = rad;} public double area( ) {return Math.PI * radius * radius;} public double perimeter( ) { return 2 * Math.PI * radius;} public String tostring( ) { return "Circle: " + radius;} private double radius; } public class Rectangle extends Shape { public Rectangle( double len, double wid ){length = len; width = wid;} public double area( ){return length * width;} public double perimeter( ){ return 2 * ( length + width );} public String tostring( ){return "Rectangle: " + length + " " + width;} public double getlength( ){return length;} public double getwidth( ) { return width;} private double length; private double width; } public class Square extends Rectangle { public Square( double side ){super( side, side );} public String tostring( ){return "Square: " + getlength( );} }

Klassen Object (std. Java), Object er overklasse for alle andre klasser public class Object { public Object(); public String tostring(); public boolean equals(object obj); public int hashcode();... } På grund af manglende typeparameterisering, benyttes Object til generiske klasser/metoder Prisen: Typedisciplinen sættes til dels over styr!

Eksempel: ArrayList (std. Java klasse) public class SimpleArrayList { public SimpleArrayList( ) {clear( );} public int size( ) {return thesize;} public Object get( int idx ) { if( idx < 0 idx >= size( ) ) throw new ArrayIndexOutOfBoundsException( "Index " + idx + "; size " + size( ) ); return theitems[ idx ]; } public Object set( int idx, Object newval ) { if( idx < 0 idx >= size( ) ) throw new ArrayIndexOutOfBoundsException( "Index " + idx + "; size " + size( ) ); Object old = theitems[ idx ]; theitems[ idx ] = newval; return old; } public boolean add( Object x ) { if( theitems.length == size( ) ) { Object [ ] old = theitems; theitems = new Object[ theitems.length * 2 + 1 ]; for( int i = 0; i < size( ); i++ ) theitems[ i ] = old[ i ];} theitems[ thesize++ ] = x; return true; } public Object remove( int idx ) { Object removeditem = theitems[ idx ]; for( int i = idx; i < size( ) - 1; i++ ) theitems[ i ] = theitems[ i + 1 ]; thesize--; return removeditem; }

public void clear( ) { thesize = 0; theitems = new Object[ DEFAULT_CAPACITY ];} private static final int DEFAULT_CAPACITY = 10; private static final int NOT_FOUND = -1; private int thesize; private Object [ ] theitems; } Det store problem når vi bruger ArrayList: - vi kan ikke specialisere til versioner som begrænser hvilken undertype Object er listen en given ArrayList indeholder - dvs. dynamisk typecheck, massevis af type casting - dvs. større risiko for uopdagede fejl, som først opdages på runtime!!! Nok et problem: Simple værdier er ikke klasser, derfor behov for wrapper classes (std. Java) public final class Integer { public Integer(int v) {value = v;} public int intvalue() {return value;}... diverse andre gode ting for heltal private int value; }

Andre bøjede søm i form af standardklasser for at kompensere for manglende typeparameterisering: public interface Comparable {int compareto( Object other); } // =0 hvis ens; positiv hvis selv < other; negativ ellers Eksempel: Antag vi skriver en klasser (ikke std. java.util): public class ArrayList_with_sorting extends ArrayList; { public void sort(); {... må typecaste Object er til Comparable} } public classe Shape extends Comparable; {... som tidligere Shape men med en compareto metode... } Korrekt brug: a = new ArrayList_with_sorting(); a.add(new triangle(...)) ; a.add(new square(...));a.sort; Men runtime-fejl i tilfælde af: - der indsættes et Object som ikke er i underklasse af Comparable - der indsættes et Object som er i underklasse af Comparable men ikke sammenlignelig med Shape.

Beslægtet std. java klasse til subtile tilfælde hvor Comparable ikke fungerer: public interface Comparator { int compare( Object lhs, Object rhs );} Læs også i bogen om Anonymous Classes som gør det lidt nemmere at skrive generisk kode. Programmering i Java: Kræver grundig debugging og disciplin for metodisk brug af nedarvningsmekanismerne Eftermiddagens opgave: Designe, implementere, diskutere klassehierarki