1 / 29

Overerving

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

melosa
Download Presentation

Overerving

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Overerving Hoofdstuk 11

  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 Visual Basic .NET voor studenten

  3. Inleiding • Hoe hergebruik stimuleren • Een 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) Visual Basic .NET voor studenten

  4. Een basisklasse: Sphere 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 Sub End Class Beschrijft enkel stilstaande objecten Deze klasse dient als basis voor Bubble (afmeting veranderen) en de klasse Ball (horizontaal bewegen) Visual Basic .NET voor studenten

  5. Een subklasse: Bubble 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 Sub End Class superklasse Overschrijft het gedrag van de basisklasse Sphere 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 Visual Basic .NET voor studenten

  7. Protected • Doel: instantievariabelen beschikbaar stellen voor subklassen • Dus: de klasse voorbereiden op hergebruik • Niveaus • Public overal toegankelijk • Protected enkel toegankelijk vanuit een subklasse en vanuit de klasse zelf • Private enkel toegankelijk vanuit de klasse zelf • 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 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 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 Visual Basic .NET voor studenten

  10. Overschrijven • Experiment: tracht eens een methode te overschrijven van een superklasse die nietOverridable is? • Beschouw volgende klassen. Schrijf een implementatie uit op papier alsook een testprogramma Visual Basic .NET voor studenten

  11. UML Diagram Sound() “huh?” Overerving wordt aangeduid door een gesloten, driehoekigepijl van de subklassenaar de superklasse Sound() “Woef woef” 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!” Sound() “Kef kef” Visual Basic .NET voor studenten

  12. Testprogramma • Wat is de uitvoer? ... Dim anim1, anim2, anim3 As Animal anim1 = 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 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 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? 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 Visual Basic .NET voor studenten

  16. Voorbeeld 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 Function End 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 Function End Class 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. Visual Basic .NET voor studenten

  18. Balloon voorbeeld 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 Visual Basic .NET voor studenten

  19. Balloon voorbeeld 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? Visual Basic .NET voor studenten

  20. Balloon voorbeeld 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 Class Expliciete oproep van de parent constructor. Merk op: deze constructor dient gedeclareerd, want constructors worden niet overgeërfd! 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 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 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 Van deze klasse kan je geen objecten maken. Logisch, want een shape heeft fysisch nog geen betekenis Visual Basic .NET voor studenten

  23. Subklasse Circle 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 Visual Basic .NET voor studenten

  24. Oefening • Animal, SmallDog, Dog • Welke klasse / methode is mogelijk abstract? • Pas de code aan Visual Basic .NET voor studenten

  25. UML notatie • Abstracte klassen en methoden worden schuin gedrukt weergegeven 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. Visual Basic .NET voor studenten

  27. Voorbeeld Public NotInheritable Class SmallDog ... End Class 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 Visual Basic .NET voor studenten

  29. Partial Form1.vb 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 IDE End Class Form1.Designer.vb Visual Basic .NET voor studenten

More Related