Overerving

29
Overerving Hoofdstuk 11

description

Overerving. Hoofdstuk 11. In dit hoofdstuk …. een nieuwe klasse maken op basis van een bestaande klasse Wanneer en hoe Protected variabelen Wanneer en hoe methodes overschrijven UML MyBase en MustInherit. Inleiding. Hoe hergebruik stimuleren - PowerPoint PPT Presentation

Transcript of Overerving

Page 1: Overerving

Overerving

Hoofdstuk 11

Page 2: Overerving

Hoofdstuk 11 Visual Basic .NET voor studenten 2

In dit hoofdstuk …

een nieuwe klasse maken op basis van een bestaande klasse

Wanneer en hoe Protected variabelen Wanneer en hoe methodes overschrijven UML MyBase en MustInherit

Page 3: Overerving

Hoofdstuk 11 Visual Basic .NET voor studenten 3

Inleiding

Hoe hergebruik stimulerenEen bestaande klasse die “bijna” alles doet

wat je wil kan je m.b.v. overerving uitbreiden Overerving is niet de enige oplossing. Een

andere (en vaak betere) methode is compositie (hoofdstuk 20)

Page 4: Overerving

Hoofdstuk 11 Visual Basic .NET voor studenten 4

Een basisklasse: SpherePublic Class Sphere

Protected xCoord As Integer = 100 Protected yCoord As Integer = 100 Protected myPen As Pen = New Pen(Color.Black)

Public WriteOnly Property X() As Integer Set(ByVal Value As Integer) xCoord = Value End Set End Property

Public WriteOnly Property Y() As Integer Set(ByVal Value As Integer) yCoord = Value End Set End Property

Public Overridable Sub Display(ByVal drawArea As Graphics) drawArea.DrawEllipse(myPen, xCoord, yCoord, 20, 20) End SubEnd Class

Public Class Sphere

Protected xCoord As Integer = 100 Protected yCoord As Integer = 100 Protected myPen As Pen = New Pen(Color.Black)

Public WriteOnly Property X() As Integer Set(ByVal Value As Integer) xCoord = Value End Set End Property

Public WriteOnly Property Y() As Integer Set(ByVal Value As Integer) yCoord = Value End Set End Property

Public Overridable Sub Display(ByVal drawArea As Graphics) drawArea.DrawEllipse(myPen, xCoord, yCoord, 20, 20) End SubEnd Class

Beschrijft enkel stilstaande objectenDeze klasse dient als basis voor Bubble (afmeting veranderen) en de klasse Ball (horizontaal bewegen)

Page 5: Overerving

Hoofdstuk 11 Visual Basic .NET voor studenten 5

Een subklasse: BubblePublic Class Bubble Inherits Sphere

Protected radius As Integer = 10

Public WriteOnly Property Size() As Integer Set (ByVal value As Integer) radius = value End Set End Property

Public Overrides Sub Display(ByVal drawArea As Graphics) drawArea.DrawEllipse(myPen, xCoord, yCoord, _ 2 * radius, 2 * radius) End SubEnd Class

Public Class Bubble Inherits Sphere

Protected radius As Integer = 10

Public WriteOnly Property Size() As Integer Set (ByVal value As Integer) radius = value End Set End Property

Public Overrides Sub Display(ByVal drawArea As Graphics) drawArea.DrawEllipse(myPen, xCoord, yCoord, _ 2 * radius, 2 * radius) End SubEnd Class

superklasse

Overschrijft het gedrag van de basisklasse Sphere

Page 6: Overerving

Hoofdstuk 11 Visual Basic .NET voor studenten 6

Betekenis van overerven

“Dit betekent dat deze klasse alle items van de klasse Sphere overerft. Bovendien heeft deze klasse toegang tot alle items die niet als Private binnen de klasse Sphere staan aangegeven”

Ook de Private items worden dus overgeërfd, ze zijn enkel niet toegankelijk

Page 7: Overerving

Hoofdstuk 11 Visual Basic .NET voor studenten 7

Protected Doel: instantievariabelen beschikbaar stellen voor subklassen Dus: de klasse voorbereiden op hergebruik Niveaus

1. Public overal toegankelijk2. Protected enkel toegankelijk vanuit een subklasse

en vanuit de klasse zelf3. Private enkel toegankelijk vanuit de klasse zelf4. Lokale variabelen bestaan enkel binnen de body van een methode

Deze sleutelwoorden zijn eveneens van toepassing op methoden Dilemma: wanneer maak ik een variabele Private en wanneer

Protected?Hergebruik = moeilijk voorspelbaar

Page 8: Overerving

Hoofdstuk 11 Visual Basic .NET voor studenten 8

Aanvullende items

De subklasse kan vanzelfsprekend aangevuld worden met instantievariabelen, methodes en properties, net zoals een “gewone” klasse

Voorbeelden radius Size() property

Page 9: Overerving

Hoofdstuk 11 Visual Basic .NET voor studenten 9

Overschrijven

Methoden/Properties uit de basisklasse van een nieuwe implementatie voorzien

Sleutelwoorden Overridable

Deze methode/property van de basisklasse kan mogelijk overschreven worden

Overrides Deze methode/property van de subklasse overschrijft een

methode/property van de basisklasse Deze methode/property kan mogelijk opnieuw overschreven

worden door een verdere subklasse van deze (sub)klasse

Page 10: Overerving

Hoofdstuk 11 Visual Basic .NET voor studenten 10

Overschrijven

Experiment: tracht eens een methode te overschrijven van een superklasse die niet Overridable is?

Beschouw volgende klassen. Schrijf een implementatie uit op papier alsook een testprogramma

Page 11: Overerving

Hoofdstuk 11 Visual Basic .NET voor studenten 11

UML Diagram

+New(in name : String)+Sound() : String+Name() : String

Animal

#nameVal : String

+Sound() : String+New(in name : String)

Dog

+Sound() : String+New(in name : String)

SmallDog

Overerving wordt aangeduid door een gesloten, driehoekige pijl van de subklasse naar de superklasse

Sound() “huh?”

Sound() “Woef

woef”

Sound() “Kef kef”

Overerving noemt men ook wel eens de IS-EEN relatie:“Een SmallDog is een Dog”“Een Dog is een Animal”“Een SmallDog is ook een Animal”“Niet alle Dogs zijn SmallDogs!”

Page 12: Overerving

Hoofdstuk 11 Visual Basic .NET voor studenten 12

Testprogramma Wat is de uitvoer?

...Dim anim1, anim2, anim3 As Animalanim1 = New Animal("Woefie")anim2 = New Dog("Pluto")anim3 = New SmallDog("Fifike")

PrintAnimal(anim1)PrintAnimal(anim2)PrintAnimal(anim3)...

Private Sub PrintAnimal(ByVal animal As Animal) MessageBox.Show("animal (" & _ animal.Name & ") sounds as: " & _ animal.Sound)End Sub

...Dim anim1, anim2, anim3 As Animalanim1 = New Animal("Woefie")anim2 = New Dog("Pluto")anim3 = New SmallDog("Fifike")

PrintAnimal(anim1)PrintAnimal(anim2)PrintAnimal(anim3)...

Private Sub PrintAnimal(ByVal animal As Animal) MessageBox.Show("animal (" & _ animal.Name & ") sounds as: " & _ animal.Sound)End Sub

Page 13: Overerving

Hoofdstuk 11 Visual Basic .NET voor studenten 13

Overerving in de praktijk

Een subklasse erft steeds alles over van al zijn superklassen (behalve constructors; zie later)

Enkel de Protected en Public members zijn beschikbaar, de Private members blijven achter de schermen aanwezig

Een klasse kan rechtstreeks slechts van één andere klasse overerven (= Single Inheritance) Java,C#: Single Inheritance C++: Multiple Inheritance

De ultieme superklasse waar elke andere klasse van overerft: System.Object

Page 14: Overerving

Hoofdstuk 11 Visual Basic .NET voor studenten 14

System.Object

De properties en methodes van deze klasse zijn universeel (voor elke klasse) nuttig en noodzakelijk.

Waarom zou je ToString() willen overschrijven?

Page 15: Overerving

Hoofdstuk 11 Visual Basic .NET voor studenten 15

MyBase

Referentie naar het (onmiddellijke) super-gedeelte van dit object

Wordt gebruikt om methode / property / variabele aanroepen te doen van de superklasse

Veel gebruikt: de overschreven methode doet hetzelfde als de methode van de superklasse + net iets meer

Page 16: Overerving

Hoofdstuk 11 Visual Basic .NET voor studenten 16

VoorbeeldPublic Class Vierkant Protected zijde As Integer

Public Sub New(ByVal z As Integer) Me.zijde = z End Sub

Public Overridable Function Oppervlakte() As Integer Return zijde * zijde End FunctionEnd Class

Public Class Vierkant Protected zijde As Integer

Public Sub New(ByVal z As Integer) Me.zijde = z End Sub

Public Overridable Function Oppervlakte() As Integer Return zijde * zijde End FunctionEnd Class

Public Class Kubus Inherits Vierkant

Public Sub New(ByVal z As Integer) MyBase.New(z) 'Me.New(z) ' Wat is hier mis mee? End Sub

Public Overrides Function Oppervlakte() As Integer Return MyBase.Oppervlakte * 6 End FunctionEnd Class

Public Class Kubus Inherits Vierkant

Public Sub New(ByVal z As Integer) MyBase.New(z) 'Me.New(z) ' Wat is hier mis mee? End Sub

Public Overrides Function Oppervlakte() As Integer Return MyBase.Oppervlakte * 6 End FunctionEnd Class

Page 17: Overerving

Hoofdstuk 11 Visual Basic .NET voor studenten 17

Constructor

Genaamd New() Als geen constructor is voorzien

impliciet een default constructor zonder params Als je wel een constructor voorziet

moet je expliciet een parameterloze constructor declareren indien nodig

Constructors worden niet overgeërfd! Een constructor van een subklasse roept

impliciet de default constructor van de superklasse op, tenzij je expliciet een andere constructor van de parent klasse aanroept.

Page 18: Overerving

Hoofdstuk 11 Visual Basic .NET voor studenten 18

Balloon voorbeeldPublic Class Balloon

Protected xCoord, yCoord, radius As Integer

Public Sub New() xCoord = 10 yCoord = 10 radius = 20 End Sub

Public Sub New(ByVal initialX As Integer, _ ByVal initialY As Integer, _ ByVal initialRadius As Integer) xCoord = initialX yCoord = initialY radius = initialRadius End Sub

' remainder of class

End Class

Public Class Balloon

Protected xCoord, yCoord, radius As Integer

Public Sub New() xCoord = 10 yCoord = 10 radius = 20 End Sub

Public Sub New(ByVal initialX As Integer, _ ByVal initialY As Integer, _ ByVal initialRadius As Integer) xCoord = initialX yCoord = initialY radius = initialRadius End Sub

' remainder of class

End Class

Page 19: Overerving

Hoofdstuk 11 Visual Basic .NET voor studenten 19

Balloon voorbeeldClass DifferentBalloon Inherits Balloon

Public Sub New(ByVal initialX As Integer, _ ByVal initialY As Integer) MyBase.New() xCoord = initialX yCoord = initialY radius = 20 End Sub

' remainder of class

End Class

Class DifferentBalloon Inherits Balloon

Public Sub New(ByVal initialX As Integer, _ ByVal initialY As Integer) MyBase.New() xCoord = initialX yCoord = initialY radius = 20 End Sub

' remainder of class

End Class

Deze oproep gebeurt altijd, tenzij je expliciet een andere constructor van de parent oproept. Dit dient dan de eerste lijn van de body te zijn

Wat zou er gebeuren als in Balloon de constructor zonder parameters wordt weggelaten?

Page 20: Overerving

Hoofdstuk 11 Visual Basic .NET voor studenten 20

Balloon voorbeeldClass ModifiedBalloon Inherits Balloon

Public Sub New(ByVal initialX As Integer, _ ByVal initialY As Integer, _ ByVal initialRadius As Integer)

MyBase.New(initialX, initialY, initialRadius) End Sub

' remainder of class

End Class

Class ModifiedBalloon Inherits Balloon

Public Sub New(ByVal initialX As Integer, _ ByVal initialY As Integer, _ ByVal initialRadius As Integer)

MyBase.New(initialX, initialY, initialRadius) End Sub

' remainder of class

End ClassExpliciete oproep van de parent constructor.

Merk op: deze constructor dient gedeclareerd, want constructors worden niet overgeërfd!

Page 21: Overerving

Hoofdstuk 11 Visual Basic .NET voor studenten 21

Abstracte klassen

Zeer dikwijls zijn base klassen van een inheritance tree niet instantieerbaar:Deze klassen voorzien enkel

gemeenschappelijke kenmerken voor subklassen, zowel properties als methoden

Deze klassen voorzien methoden/properties zonder implementatie, die wel in subklassen zinvol kunnen worden ingevuld

Page 22: Overerving

Hoofdstuk 11 Visual Basic .NET voor studenten 22

Voorbeeld (licht gewijzigd)Public MustInherit Class Shape

Protected xCoord, yCoord As Integer Protected myPen As Pen = New Pen(Color.Black)

Public Sub MoveRight() xCoord = xCoord + 10 End Sub

Public MustOverride Sub Display(ByVal drawArea As Graphics)

End Class

Public MustInherit Class Shape

Protected xCoord, yCoord As Integer Protected myPen As Pen = New Pen(Color.Black)

Public Sub MoveRight() xCoord = xCoord + 10 End Sub

Public MustOverride Sub Display(ByVal drawArea As Graphics)

End Class

Van deze klasse kan je geen objecten maken.

Logisch, want een shape heeft fysisch nog geen betekenis

Van deze methode bestaat (nog) geen implementatie. Deze moet ingevuld worden in de subklassen.

Logisch, want een Shape is pas toonbaar als we al zijn eigenschappen bepaald hebben

Page 23: Overerving

Hoofdstuk 11 Visual Basic .NET voor studenten 23

Subklasse CirclePublic Class Circle Inherits Shape

Protected radius As Integer

...

Public Overrides Sub Display(ByVal drawArea As Graphics) drawArea.DrawEllipse(myPen, xCoord, yCoord, radius, radius) End Sub

End Class

Public Class Circle Inherits Shape

Protected radius As Integer

...

Public Overrides Sub Display(ByVal drawArea As Graphics) drawArea.DrawEllipse(myPen, xCoord, yCoord, radius, radius) End Sub

End Class

Een Circle is een Shape met een straal (radius).

Nu kan de Display methode zinvol geïmplementeerd worden

Page 24: Overerving

Hoofdstuk 11 Visual Basic .NET voor studenten 24

Oefening

Animal, SmallDog, DogWelke klasse / methode is mogelijk abstract?Pas de code aan

Page 25: Overerving

Hoofdstuk 11 Visual Basic .NET voor studenten 25

UML notatie

Abstracte klassen en methoden worden schuin gedrukt weergegeven

+New(in name : String)+Sound() : String+Name() : String

#nameVal : String

Animal

Page 26: Overerving

Hoofdstuk 11 Visual Basic .NET voor studenten 26

NotInheritable

In sommige gevallen kan je als programmeur beslissen dat van een klasse niet meer kan overgeërfd worden Veiligheidsoverweging

Bv. een klasse die een methode heeft om paswoorden te valideren

Let hiermee op, want je beperkt dus hergebruik van je klasse!

Soms zijn toch zinvolle voorbeelden te vinden: De klasse System.Math is NotInheritable, een

wiskundige functie ligt voor altijd vast.

Page 27: Overerving

Hoofdstuk 11 Visual Basic .NET voor studenten 27

Voorbeeld

Public NotInheritable Class SmallDog...End Class

Public NotInheritable Class SmallDog...End Class

Page 28: Overerving

Hoofdstuk 11 Visual Basic .NET voor studenten 28

Partial

Om de gegenereerde code netjes te kunnen scheiden van de code van de programmeur

Voor eigen klassen niet aanbevolen

Page 29: Overerving

Hoofdstuk 11 Visual Basic .NET voor studenten 29

PartialPublic Class Form1

' Hier schrijf je eigen code, zoals: ' - event-code ' - methodes ' - ...End Class

Public Class Form1

' Hier schrijf je eigen code, zoals: ' - event-code ' - methodes ' - ...End Class

<Global.Microsoft.VisualBasic.CompilerServices.DesignerGenerated()> _Partial Class Form1 Inherits System.Windows.Forms.Form ' Hier staat code gegenereerd door de IDEEnd Class

<Global.Microsoft.VisualBasic.CompilerServices.DesignerGenerated()> _Partial Class Form1 Inherits System.Windows.Forms.Form ' Hier staat code gegenereerd door de IDEEnd Class

Form1.vb

Form1.Designer.vb