Overerving
description
Transcript of Overerving
Overerving
Hoofdstuk 11
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
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)
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)
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
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
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
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
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
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
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!”
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
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
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?
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
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
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.
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
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?
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!
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
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
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
Hoofdstuk 11 Visual Basic .NET voor studenten 24
Oefening
Animal, SmallDog, DogWelke klasse / methode is mogelijk abstract?Pas de code aan
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
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.
Hoofdstuk 11 Visual Basic .NET voor studenten 27
Voorbeeld
Public NotInheritable Class SmallDog...End Class
Public NotInheritable Class SmallDog...End Class
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
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