De presentatie wordt gedownload. Even geduld aub

De presentatie wordt gedownload. Even geduld aub

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

Verwante presentaties


Presentatie over: "Overerving Inheritance Overerving l Inleiding l Type-extensie l Compatibiliteit van een basistype met zijn extensie l Statisch en dynamisch type l Run."— Transcript van de presentatie:

1

2 Overerving Inheritance

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

4 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

5 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

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

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

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

9 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

10 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)

11 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

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

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

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

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

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

17 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

18 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.

19 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)

20 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

21 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

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

23 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

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

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

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

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

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

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

30 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;

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

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

33 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.

34 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

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

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

37 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.

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

39 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.

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

41 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.

42 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;

43 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.

44 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).

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

46 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;

47 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.

48 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.

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

50 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.

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

52 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.

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

54 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.

55 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;

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

57 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.

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

59 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.

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

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

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

63 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

64 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.

65 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.

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

67 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.

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

69 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.

70 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.

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

72 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.

73 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.

74 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.

75 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.

76 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.

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

78 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.

79 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.

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

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

82 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

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

84 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.

85 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.

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

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

88 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

89 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.

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

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

92 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;

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

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

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

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

97 Voorbeeld (2) MODULE TypeTest


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

Verwante presentaties


Ads door Google