Overerving Inheritance Overerving l Inleiding l Type-extensie l Compatibiliteit van een basistype met zijn extensie l Statisch en dynamisch type l Run.

Slides:



Advertisements
Verwante presentaties
Informatieanalyse klassediagram I.
Advertisements

Les 2 klassediagrammen II
PSD Basisstructuren programmeren.
KINN 2010 •OOP •O Object •O Georiënteerd •P Programmeren.
Programmeren in Java met BlueJ
Marktonderzoek als proces
EVMINX4 Week 3 Algoritmen en Datastructuren (ALDAT)
Instructie Programmeren Task 8 5JJ70. PAGE 2 Task 8: Double Linked List Het doel van deze opdracht is: Het opbouwen van een tweetal klassen, die samen.
PROS2 Les 11 Programmeren en Software Engineering 2.
Objecten Hoofdstuk 6 Hoofdstuk 6 Hoofdstuk 6 1.
Computervaardigheden en Programmatie Universiteit AntwerpenObjecten 4.1 Computervaardigheden en Programmatie 1rste BAC Toegepaste Biologische Wetenschappen.
Hoofdstuk 6: Controle structuren
1 SOCS Hoofdstuk 1 Programmeertaal C. 2 Kenmerken van C Hogere programmeertaal  Grote verzameling types, strenge type controle  Zelf nieuwe types definiëren.
VHDL Peter Slaets KHLim Functies en procedures Functies –type conversie functies »bit vector to integer en omgekeerd –verkorte componenten met maar 1 output.
1 Datastructuren Sorteren: alleen of niet alleen vergelijkingen College 5.
1 Datastructuren Lijstjes (Stacks & Queues) Onderwerp 7.
1 Datastructuren Sorteren: alleen of niet alleen vergelijkingen (II) College 6.
De koektrommel of de grabbelton
1/1/ / faculty of Computer Science eindhoven university of technology 5B040:Computerarchitectuur 2M200:Inleiding Computersystemen Sessie 7(1): Flow of.
Verdieping Programmeren in Java - deel 1 college 6 mei 2001.
Java patterns Introductie tot GoF patterns in Java.
Het verbeteren van een modulaire verificatie techniek voor aspect georiënteerd programmeren Alfons Laarman.
Frank Stalpers en Ad Baars
Inleidend probleem Data structuur (hiërarchie van classes)
Overerving Hoofdstuk 11 Hoofdstuk 11.
Marktonderzoek als proces
Designing Knowledge Systems b Hoofdstuk 11 van Knowledge Engineering and Management. The CommonKADS Methodology. b A.Th. Schreiber, J.M. Akkermans, A.A.Anjewierder,
Visual Basic.
Algoritmiek Object-georiënteerd Programmeren
1 Datastructuren Introductie tot de programmeeropgaven in C++ Jan van Rijn
Hogeschool HZ Zeeland 19 augustus 2003augustus 2003 Data Structuren & Algoritmen Week 3.
Looking at Code Size and Performance Kevin Muys.  Hoe efficiënt is C++ vergeleken met C  Hoe beïnvloed C++ het benodigde geheugen  Oplossingen voor.
Object georiënteerd programmeren in Alice
OO Analyse in de praktijk OO Analyse in de praktijk V Enkele Design Patterns.
Variabelen Part deux.. Variabelen week 3 0. Herhaling 1. De NullPointerException (p101) 2. Primitieven 3. Scope en levensduur van variabelen 4. Meerdere.
Slide 1Programmatuur voor real-time controleYolande Berbers RTPReal-Time Programmatuur hoofdstuk 4: het beheersen van complexiteit: programming in the.
Les 7 Multiple Document Interface Programmeren met Visual Basic Karl Moens.
Overerving: It’s a kind of magic…. Principes van OO: 1) Overerving 2) Encapsulatie 3) Polymorphisme = (deel van het) OO. paradigma.
Interfaces Hoofdstuk 23 Hoofdstuk 23.
Variabelen Part deux.. Variabelen week 3 0. Herhaling 1. De NullPointerException (p101) 2. Primitieven 3. Scope en levensduur van variabelen 4. Meerdere.
Introductie tot GoF patterns in Java
Polymorfisme: inleiding Hello me, meet the real me…
Refactoring en Unit Testing. Geschiedenis Hoe maken we complexe code duidelijker? Hoger abstractieniveau –Assembly –“Hogere” programmeertalen –Object-orientatie.
Tircms02-p les 3 Functies Strings Structuren. Functies 1. main() 2. { int k; k = 10 ; printf(“%d\n”,fac(k)); } 3. int fac(n) int n; 4. { int f; f= 1;
Tircms02-p les 2 Meer operatoren Arrays en pointers Types en conversie.
tircms02-p les 1 Operating Systems practicum
Tircms03-p les 4 Klassen. Abstracte datatypes in C struct stack { char info[100]; int top; }; void reset(stack *s) { s->top = -1; } void push(stack *s,
Bewerkingen met Strings
Polymorphisme en Interfaces: inleiding
Java Objectgeoriënteerd Programmeren in Java met BlueJ
Java Objectgeoriënteerd Programmeren in Java met BlueJ Hoofdstuk 7 Polymorfie en overerving © 2014, Gertjan Laan, versie 2.
Variabelen. Wat zijn variabelen? Klassiek: een variabele houdt informatie bij. Klassiek: een variabele houdt informatie bij. bvb: int getal; getal = 5;
Variabelen. Wat zijn variabelen? In een programmeertaal zijn er “dingen” nodig die ervoor zorgen dat het programma informatie voor korte of langere tijd.
Codetuts Academy Les 6 Module 2a Php Fundamentals 1.
Eigen klassen maken A new way of thinking.. Wat? Zie voorbeeld. Zie voorbeeld.
GEGEVENSSTRUCTUREN IN.NET. Inleiding  Enumerated type  Structure  Collecties  Typed collections  Untyped collections.
Java voor beginners Doel: Een spel maken in LWJGL Door: Jim van Leeuwen.
De definitie van een object. Een object is een verzameling van eigenschappen en bewerkingen. Veel voorkomende objecten zijn: D (display) Gui (user interface)
Informatie beoordelen If else Switch En Wiskunde.
Objectgeoriënteerd Programmeren
Gameprogrammeren: Objecten en geheugen
Gameprogrammeren: Overerving
Gameprogrammeren: Methoden
Gameprogrammeren: Overerving in Painter
Tinpro015b-les 1 C++ voor C-kenners Voor Technische Informatica.
Gameprogrammeren: Abstracte klassen
Arjan Egges & Paul Bergervoet
SQL Les February 2019.
Methodes op klasseniveau
Software Development fundamentals
Transcript van de presentatie:

Overerving Inheritance

Overerving l Inleiding l Type-extensie l Compatibiliteit van een basistype met zijn extensie l Statisch en dynamisch type l Run time type checking

Inleiding l Klassen l Procedureel programmeren l Object-georiënteerd programmeren l Basisprincipe in software-engineering l Modulaire en procedurele software l Oplossing: object oriëntatie

Inleiding (1) l Klassen als ADT gebruikt. l Klassen kunnen uitgebreid worden: –nieuw aspect van OOP –de reden waarom OOP dikwijls beter zijn dan de procedurele programmeertalen

Inleiding (2) Procedureel programmeren Analyse en ontwerp van software: 1. Verwerking 2. Datastructuren

Inleiding (3) Object-georiënteerd programmeren Analyse en ontwerp van software: 1. Datastructuren 2. Verwerking Belangrijk: datastructuren zijn van primordiaal belang in software- ontwikkeling

Inleiding (4) Basisprincipe in software-engineering: l optimaal onderhoud l optimale uitbreidingsmogelijkheden (hergebruik) van ontwikkelde software

Inleiding (5) Modulaire en procedurele software: l voorzien van standaard bibliotheken l procedures en datatypes liggen vast op compilatietijdstip l aanpassingen en uitbreidingen moeten gebeuren op de oorspronkelijke sourcecode

Inleiding (6) Modulaire software is “statisch” en niet uitbreidbaar l gegevenselementen zijn statisch gebonden aan een bepaalde variabele l procedures zijn statisch gebonden aan een bepaalde module (operaties van een ADT zijn statisch gebonden aan het ADT)

Inleiding (7) Oplossing : object-oriëntatie l type-extensie: uitbreiding van een reeds bestaand type met bijkomende gegevenselementen door de gebruiker l proceduretypes: (dynamische) toekenning van procedures aan procedure-variabelen van dit type

Type-extensie l Type-extensie van recordtypes l Type-extensie van pointertypes l Voorbeelden l Overriding l Voorbeeld l Het symbool ^

Type-extensie van recordtypes (1) BasisRecord = RECORD a: TYPE1; END; EersteUitbreiding = RECORD (BasisRecord ) b: TYPE2; END;

Type-extensie van recordtypes (2) TweedeUitbreiding = RECORD (EersteUitbreiding) c: TYPE3; END;

Type-extensie van recordtypes (3) uitbreidingen EersteUitbreiding en TweedeUitbreiding : uitbreidingen (type-extensies) van BasisRecord directe uitbreiding EersteUitbreiding: directe uitbreiding (directe extensie) van BasisRecord

Type-extensie van recordtypes (4) basistypes BasisRecord en EersteUitbreiding: basistypes van TweedeUitbreiding BasisRecord: direct basistype direct basistype van EersteUitbreiding

Type-extensie van recordtypes (5) In het geval van klassen: l het basistype wordt de basisklasse of de superklasse genoemd l de uitbreiding wordt de subklasse genoemd

Type-extensie van recordtypes (6) De naam van het basistype tussen haakjes specificeren achter “RECORD” betekent dat het nieuwe type een uitbeiding is van het basistype en dus bovendien alle velden en methodes van zijn basistype bevat.

Type-extensie van recordtypes (7) l Het uitgebreid type erft de velden en de methodes over van zijn basistype. l Type -extensie (type-uitbreiding)  overerving (inheritance)

Type-extensie van recordtypes (8) l een variabele van het type BasisRecord : a l een variabele van het type EersteUitbreiding: b en a a is “geerfd” van BasisRecord l een variabele van het type TweedeUitbreiding : c en b en a b en a is “geerfd” van de oorspronkelijke types

Type-extensie van recordtypes (9) Referentie naar de velden VAR b1, b2: BasisType; e1, e2: EersteUitbreiding; t1, t2: TweedeUitbreiding; … t2.a t2.b t2.c

Type-extensie van recordtypes (10) l “specialisatie” van een oorspronkelijk type l aanvulling met extra eigenschappen l een beperking door aanvullende structuur

Type-extensie van recordtypes (11) Men gaat van abstracte naar steeds meer gedetailleerde types. Voorbeeld: een (abstracte) figuur uitgebreid tot een veelhoek, uitgebreid tot een vierhoek, uitgebreid tot een rechthoek, uitgebreid tot een vierkant

Type-extensie van pointertypes (1) BasisRecWijzer = POINTER TO BasisRecord; BasisRecord = RECORD a: TYPE1; END;

Type-extensie van pointertypes (2) EersteUitbrWijzer = POINTER TO EersteUitbreiding; EersteUitbreiding = RECORD (BasisRecord ) b: TYPE2; END;

Type-extensie van pointertypes (3) l EersteUitbrWijzer is een uitbreiding (extensie) van BasisRecWijzer. l BasisRecWijzer is het basistype van EersteUitbrWijzer

Type-extensie van pointertypes (4) TweedeUitbrWijzer= POINTER TO TweedeUitbreiding; TweedeUitbreiding = RECORD (EersteUitbreiding) c: TYPE3; END;

Voorbeeld 1 (1) MODULE Directories; TYPE Key* = ARRAY 32 OF CHAR; Node* = POINTER TO NodeDesc; NodeDesc* = RECORD key*:Key; next:Node END;

Voorbeeld 1 (2) MODULE PhoneBook; IMPORT Directories; TYPE Entry = POINTER TO EntryDesc; EntryDesc = RECORD (Directories. NodeDesc) phone: ARRAY 16 OF CHAR; END;

Voorbeeld 2 (1) TYPE Figure = POINTER TO FigureDesc; FigureDesc = RECORD selected: BOOLEAN; PROCEDURE (f: Figure) Draw; PROCEDURE (f: Figure) Move (dx, dy: INTEGER); PROCEDURE (f: Figure) Store (VAR rider: OS.Rider); END;

Voorbeeld 2 (2) Rectangle = POINTER TO RectangleDesc; RectangleDesc = RECORD (FigureDesc) x, y, w, h: INTEGER; PROCEDURE (r: Rectangle) Fill (pat: Display.Pattern) END;

Voorbeeld 2 (3) VAR figure: Figure; rectangle: Rectangle;... rectangle.selected rectangle.Draw rectangle.x rectangle.Fill

Voorbeeld 2 (4) l Het eerste gedeelte van RectangleDesc object is identiek met een FigureDesc object. l Methodes worden niet in elk object bewaard, maar enkel 1 per klasse.

Voorbeeld 2 (5) l de waarden van de pointervariabelen  objecten l objecten van de klasse Figure of Rectangle:  objecten van de klasse FigureDesc of RectangleDesc

Voorbeeld 2 (6) TYPE TextBox = POINTER TO TextBoxDesc; TextBoxDesc = RECORD (RectangleDesc) text: ARRAY 32 OF CHAR END;

Voorbeeld 2 (7) Voorbeeld 2 (7) Circle = POINTER TO CircleDesc; CircleDesc = RECORD (FigureDesc) x, y, radius: INTEGER END;

Voorbeeld 2 (8) l Elke TextBox is ook een Rectangle. l Elke Rectangle is een Figure. l Niet elke Figure is een Rectangle of een Circle.

Voorbeeld 2 (9) l Een uitgebreid type is een specialisatie van zijn basistype. l Rechthoeken zijn speciale figuren.

Overriding (1) l Subklassen kunnen overgeërfde methodes herdefiniëren. l Een overgeërfde methode kan geherdefinieerd (overridden) worden door de methode terug te declareren met dezelfde naam en met een identieke parameterlijst in de subklasse.

Overriding (2) l Enkel methodes kunnen geherdefinieerd worden, dus niet de data velden!

Voorbeeld (1) l De klasse Figure bevat de methode Store. l Store schrijft de velden van een figuur naar een bestand. l Als Store overgeërfd wordt door Rectangle, moeten ook de velden x, y, w en h naar het bestand worden weggeschreven.

Voorbeeld (2) Store moet als volgt worden geherdefinieerd: PROCEDURE (r:Rectangle) Store (VAR rider: OS.Rider); BEGIN r.Store^(rider); …write r.x, r.y, r.w, r.h to rider … END Store;

Voorbeeld (3) l Store moet niet volledig worden herschreven. l Store uit de klasse Figure zal worden herbruikt. l De Store uit de klasse Figure kan niet langer gebruikt worden als r.Store.

Het symbool ^ l Daarom: r.Store^(rider) l Het symbool ^ achter de methode naam duidt de Store methode aan van de directe superklasse van Rectangle (het type van r).

Compatibiliteit van een basistype met zijn extensie l Inleiding l Record toekenningen l Pointer toekenningen l Records als variabele parameters l Voorbeelden

Inleiding (1) NewRectangle = POINTER TO NewRectangleDesc; NewRectangleDesc = RECORD selected: BOOLEAN; x, y, w, h: INTEGER; PROCEDURE (r: NewRectangle) Draw; PROCEDURE (r: NewRectangle) Move (dx, dy: INTEGER); PROCEDURE (r: NewRectangle) Store (VAR rider: OS.Rider); PROCEDURE (r: NewRectangle) Fill (pat: Display.Pattern) END;

Inleiding (2) Verschil tussen Rectangle en NewRectangle: l Rectangle is compatibel met Figure omdat Rectangle een uitbreiding is van Figure. l NewRectangle is niet compatibel met Figure.

Inleiding (3) Elk Rectangle object is ook een Figure object! D.w.z.: alle procedures die werken met Figure objecten, werken ook met Rectangle objecten.

Record toekenningen (1) De compatibiliteit tussen een basistype en zijn uitbreiding wordt gebruikt in toekenningen. VAR figureDesc: FigureDesc; rectangleDesc: RectangleDesc; figureDesc:= rectangleDesc;

Record toekenningen (2) l De toekenning is te vergelijken met een projectie. l Enkel de velden van rectangleDesc, die ook in figureDesc bestaan, worden toegekend.

Record toekenningen (3) Verboden: rectangleDesc:= figureDesc; Een FigureDesc object is geen RectangleDesc object.

Record toekenningen (4) l Een object doorgeven als een waarde parameter is ook een toekenning. l Een procedure met een formele parameter van het type FigureDesc kan worden aangeroepen met een RectangleDesc object als actuele parameter.

Pointer toekenningen (1) VAR figure: Figure; rectangle: Rectangle; figure:= rectangle;

Pointer toekenningen (2) l Er gaat geen data van het object rectangle^ verloren. l Na de toekenning wijst figure naar rectangle^, waarvan het eerste deel wordt geïnterpreteerd als een object van het type FigureDesc.

Pointer toekenningen (3) l De velden x, y, w, h bevinden zich ook in het object, waarnaar figure wijst. l Deze velden zijn niet toegankelijk via figure omdat figure gedeclareerd is als een variabele van het type POINTER TO FigureDesc;

Pointer toekenningen (4) Verboden: rectangle:= figure; rectangle zou wijzen naar een FigureDesc object en de velden x, y, w en h zouden ongedefinieerd blijven.

Records als variabele parameters (1) l Nog een situatie waarin een extensie compatibel is met zijn basistype: doorgave van een record als een VAR parameter. l M.a.w.: een actuele parameter mag een extensie zijn van de formele VAR parameter, maar niet omgekeerd.

Records als variabele parameters (2) PROCEDURE P (VAR figureDesc: FigureDesc); Deze procedure kan worden aangeroepen met een parameter van het type RectangleDesc: P(rectangleDesc)

Records als variabele parameters (3) l Met variable parameters wordt er geen toekenning uitgevoerd. l De formele parameter figureDesc heeft enkel hetzelfde adres als de actuele parameter rectangleDesc. l Dit is te vergelijken met pointer toekenningen.

Voorbeelden (1) VAR figure: Figure; rectangle: Rectangle; circle: Circle; textBox: TextBox;

Voorbeelden (2) a) figure:= rectangle; b) rectangle:= figure; c) figure:= circle; d) figure:= textBox;

Voorbeelden (3) e) rectangle:= circle; f) circle:= rectangle; g) rectangle:= textBox; h) circle:= textBox;

Statisch en dynamische type l Statisch type l Dynamisch type l Pointer toekenning l Record toekenning l Records als variabele parameters l Voorbeeld l Samenvatting

Statisch type l Het statisch type is het type waarmee de variabele gedeclareerd is. l Het statisch type wordt door de compiler gebruikt voor type checking.

Dynamisch type (1) l Het dynamisch type is het type van het object dat de variabele at run time bevat. l Dit kan een extensie zijn van het statisch type. l Het dynamisch type wordt gebruikt om de methode at run time te selecteren.

Dynamisch type (2) l Objecten moeten dus type informatie at run time bevatten. l Dit is typisch voor OOP.

Pointer toekenning figure:= rectangle; l figure wijst naar een object van het type rectangleDesc. l Het statisch type van figure is Figure. l Het dynamisch type van figure is Rectangle.

Record toekenning (1) figureDesc:= rectangleDesc; l Enkel de gemeenschappelijke velden worden toegekend. l figureDesc bevat niet de ganse inhoud van rectangleDesc.

Record toekenning (2) l Het dynamisch type van figureDesc is FigureDesc en dus niet RectangleDesc. l Het statisch type en het dynamisch type van een record is hetzelfde. l Uitzondering: records als variabele parameters doorgeven.

Records als variabele parameters l Een formele variabele parameter heeft hetzelfde adres als de respectievelijke actuele parameter. l Dit is hetzelfde als bij pointers: het dynamisch type kan een uitbreiding zijn van het statisch type.

Voorbeeld (1) PROCEDURE P (VAR f: FigureDesc); VAR g: FigureDesc; BEGIN f:=g; END P;

Voorbeeld (2) l Het statement f:=g levert geen probleem op. l P(fig) wordt aangeroepen met fig van het type RectangleDesc  de velden x, y, w en h in actuele parameter blijven ongedefinieerd.

Voorbeeld (3) Oplossing van het probleem in Oberon: een toekenning aan een variabele parameter record is enkel toegelaten als zijn dynamisch type gelijk is aan zijn statisch type.

Voorbeeld (4) l Het dynamisch type van f is RectangleDesc; l Het statisch type van f is FigureDesc. l f:=g is dus niet toegelaten. l Deze controle gebeurt at run time.

Samenvatting (1) l Een variabele van een record type T kan enkel waarden bevatten van het type T l Een formele variabele parameter van een record type T kan waarden bevatten van het type T of van een extensie van het type T.

Samenvatting (2) l Een variabele van het type POINTER TO T kan pointers bevatten naar waarden van een het type T of van een extensie van het type T.

Run time type checking l Type test l Type guard l Voorbeelden l WITH statement

Type test l Het dynamisch type van een record of van een pointer variabele kan at run time worden getest l figure IS Rectangle  TRUE als figure als dynamisch type Rectangle (of een extensie ervan) heeft.

Type guard (1) rectangle:= figure is toegelaten als: 1) figure als dynamisch type Rectangle heeft 2) er een type guard (typebewaking) voor figure gespecificeerd is.

Type guard (2) figure (Rectangle) Hiermee wordt at run time gecontroleerd of figure als dynamisch type Rectangle (of een extensie ervan) heeft.

Type guard (3) l Expliciete aanduiding van het dynamisch type. l Er kan gerefereerd worden naar de uitbreidingselementen.

Type guard (4) Een typebewaking van de vorm v(T) is enkel toepasbaar onder de volgende voorwaarden: l T breidt het statische (gedeclareerde) type van de variabele v uit en l v is een pointer of een formele VAR parameter van een recordtype

Voorbeelden 1) rectangle:= figure (Rectangle) 2) figure (Rectangle).x:=0 3) figure (Rectangle).Fill(pat)

Type guard (5) De type guard figure (Rectangle) speelt een dubbele rol: lhlhet controleert of figure het dynamisch type Rectangle heeft lhlhet wijzigt tijdelijk het statisch type van figure in Rectangle.

Type guard (6) l Type guard is dus een soort van type conversie. l Run time fouten t.g.v. een foutieve type guard kan vermeden worden met een type test.

Type guard (7) IF figure IS Rectangle THEN rectangle:= figure (Rectangle) END;

Voorbeelden (1) Welke statements zijn correct? 1) textBox := rectangle (TextBox) 2) rectangle := figure (TextBox) 3) rectangle := circle (Rectangle) 4) figure := circle ; rectangle := figure (Rectangle)

Voorbeelden (2) Welke type testen geven de waarde TRUE terug, indien figure als dynamisch type TextBox heeft? 1) figure IS Figure 2) figure IS Rectangle 3) figure IS TextBox

WITH statement (1) In omstandigheden waarin men veel velden van een dynamisch type moet gebruiken kan men een “regionale bewaking” gebruiken. Onderstel dat f een formele variabele parameter van het statische type FigureDesc is.

WITH statement (2) I.p.v. te schrijven: f(RectangleDesc).x:= …; f(RectangleDesc).y:= …; f(RectangleDesc).Fill(…);

WITH statement (3) kan je schrijven: WITH f: RectangleDesc DO f.x:= …; f.y:= …; f.Fill (…) END;

WITH statement (4) l Een WITH statement is een regionale type guard. l WITH statements kunnen eveneens toegepast worden op pointers. WITH figure: Rectangle DO figure.x:= …; figure.y:= … END;

Voorbeeld (1.1) TYPE Person=RECORD first, last:Name; idno:INTEGER; birth:Date; END;

Voorbeeld (1.2) Pilot=RECORD (Person) hoursInFlight:INTEGER; END; Clerck=RECORD (Person) jobCode:INTEGER; END;

Voorbeeld (1.3) PROCEDURE ProcessPerson (VAR p:Person); BEGIN... IF p IS Pilot THEN WITH p:Pilot DO... END

Voorbeeld (1.4) ELSIF p IS Clerck THEN WITH p: Clerck DO... END END ProcessPerson;

Voorbeeld (2) MODULE TypeTest