24
Visual Basic.NET Pag.1 Hoofdstuk 6 – Objectgeoriënteerd Programmeren: Overerving Inleiding Basisklasses en Afgeleide Klasses Protected en Friend Members Relatie tussen Basisklasses en Afgeleide Klasses Constructors en Finalizers in Afgeleide Klasses Impliciete conversie van Afgeleide-Klasse- Object naar Basis-Klasse-Object Software Engineering met Overerving Compositie vs. Overerving Case Study: Point, Circle, Cylinder Visuele Overerving

Hoofdstuk 6 – Objectgeoriënteerd Programmeren: Overerving

  • Upload
    apu

  • View
    26

  • Download
    0

Embed Size (px)

DESCRIPTION

Hoofdstuk 6 – Objectgeoriënteerd Programmeren: Overerving. Inleiding   Basisklasses en Afgeleide Klasses   Protected en Friend Members   Relatie tussen Basisklasses en Afgeleide Klasses   Constructors en Finalizers in Afgeleide Klasses - PowerPoint PPT Presentation

Citation preview

Page 1: Hoofdstuk 6 – Objectgeoriënteerd Programmeren: Overerving

Visual Basic.NET Pag.1

Hoofdstuk 6 – Objectgeoriënteerd Programmeren: Overerving

• Inleiding

•   Basisklasses en Afgeleide Klasses

•   Protected en Friend Members

•   Relatie tussen Basisklasses en Afgeleide Klasses

•   Constructors en Finalizers in Afgeleide Klasses

•   Impliciete conversie van Afgeleide-Klasse-Object naar

Basis-Klasse-Object

•   Software Engineering met Overerving

•   Compositie vs. Overerving

•   Case Study: Point, Circle, Cylinder

• Visuele Overerving

Page 2: Hoofdstuk 6 – Objectgeoriënteerd Programmeren: Overerving

Visual Basic.NET Pag. 2Hoofdstuk 6: Objectgeoriënteerd programmeren: Overerving

6.1 Inleiding

Base class Derived classes CStudent CGraduateStudent

CUndergraduateStudent

CShape CCircle CTriangle CRectangle

CLoan CCarLoan CHomeImprovementLoan CMortgageLoan

CEmployee CFacultyMember CStaffMember

CAccount CCheckingAccount CSavingsAccount

Fig. 9.1 Some simple inheritance examples.

Enkele voorbeelden van overerving

Page 3: Hoofdstuk 6 – Objectgeoriënteerd Programmeren: Overerving

Visual Basic.NET Pag. 3Hoofdstuk 6: Objectgeoriënteerd programmeren: Overerving

6.2 Basisklasses en afgeleide klasses

CommunityMember

Employee Student Alumnus

Faculty Staff

Administrator Teacher

Overervingshierarchie voor CCommunityMembers (universiteitsgemeenschap)

Page 4: Hoofdstuk 6 – Objectgeoriënteerd Programmeren: Overerving

Visual Basic.NET Pag. 4Hoofdstuk 6: Objectgeoriënteerd programmeren: Overerving

6.3 Protected en Friend members

Gedeelte van een CShape klassenhierarchie

CShape

CTwoDimensionalShape CThreeDimensionalShape

CSphere CCube CCylinderCTriangleCSquareCCircle

Page 5: Hoofdstuk 6 – Objectgeoriënteerd Programmeren: Overerving

Visual Basic.NET Pag. 5Hoofdstuk 6: Objectgeoriënteerd programmeren: Overerving

6.4 Relatie tussen basisklasses en afgeleide klasses

• Structurele Overerving

BasisklasseDe basisklasse moet gedeclareerd worden als

“overridable” als een bepaalde methode moeten worden overridden in de afgeleide klasse

De basisklasse moet in de mogelijkheid zijn om zijn implementatie vrij te veranderen

Derived ClassEen object van de afgeleide klasse kan een illegale

waarde toekennen aan de Protected data, zodat het object in een incosistente staat komt

Afgeleide klasses zouden alleen mogen afhangen van de services (methodes en properties die niet Private zijn) van de basisklasse

Page 6: Hoofdstuk 6 – Objectgeoriënteerd Programmeren: Overerving

Visual Basic.NET Pag. 6Hoofdstuk 6: Objectgeoriënteerd programmeren: Overerving

Class CTime inherits existing pieces of class Object.

1 ' Fig. 9.4: Point.vb2 ' CPoint class represents an x-y coordinate pair.3 4 Public Class CPoint5 ' implicitly Inherits Object6 7 ' point coordinate8 Private mX, mY As Integer9 10 ' default constructor11 Public Sub New()12 13 ' implicit call to Object constructor occurs here14 X = 015 Y = 016 End Sub ' New17 18 ' constructor19 Public Sub New(ByVal xValue As Integer, _20 ByVal yValue As Integer)21 22 ' implicit call to Object constructor occurs here23 X = xValue24 Y = yValue25 End Sub ' New26 27 ' property X28 Public Property X() As Integer29 30 Get31 Return mX32 End Get33

Page 7: Hoofdstuk 6 – Objectgeoriënteerd Programmeren: Overerving

Visual Basic.NET Pag. 7Hoofdstuk 6: Objectgeoriënteerd programmeren: Overerving

Class CTime inherits existing pieces of class Object.

34 Set(ByVal xValue As Integer)35 mX = xValue ' no need for validation36 End Set37 38 End Property ' X39 40 ' property Y 41 Public Property Y() As Integer42 43 Get44 Return mY45 End Get46 47 Set(ByVal yValue As Integer)48 mY = yValue ' no need for validation49 End Set50 51 End Property ' Y52 53 ' return String representation of CPoint54 Public Overrides Function ToString() As String55 Return "[" & mX & ", " & mY & "]"56 End Function ' ToString57 58 End Class ' CPoint

Page 8: Hoofdstuk 6 – Objectgeoriënteerd Programmeren: Overerving

Visual Basic.NET Pag. 8Hoofdstuk 6: Objectgeoriënteerd programmeren: Overerving

Class CTime inherits existing pieces of class Object.

1 ' Fig. 9.12: Circle4.vb2 ' CCircle4 class that inherits from class CPoint.3 4 Public Class CCircle45 Inherits CPoint ' CCircle4 Inherits from class CPoint6 7 Private mRadius As Double8 9 ' default constructor10 Public Sub New()11 12 ' implicit call to CPoint constructor occurs here13 Radius = 014 End Sub ' New15 16 ' constructor17 Public Sub New(ByVal xValue As Integer, _18 ByVal yValue As Integer, ByVal radiusValue As Double)19 20 ' use MyBase reference to CPoint constructor explicitly21 MyBase.New(xValue, yValue)22 Radius = radiusValue23 End Sub ' New24 25 ' property Radius26 Public Property Radius() As Double27 28 Get29 Return mRadius30 End Get31 32 Set(ByVal radiusValue As Double)33

Page 9: Hoofdstuk 6 – Objectgeoriënteerd Programmeren: Overerving

Visual Basic.NET Pag. 9Hoofdstuk 6: Objectgeoriënteerd programmeren: Overerving

Class CTime inherits existing pieces of class Object.

34 If radiusValue > 035 mRadius = radiusValue36 End If37 38 End Set39 40 End Property ' Radius41 42 ' calculate CCircle diameter43 Public Function Diameter() As Double44 Return mRadius * 245 End Function ' Diameter46 47 ' calculate CCircle4 circumference48 Public Function Circumference() As Double49 Return Math.PI * Diameter()50 End Function ' Circumference51 52 ' calculate CCircle4 area53 Public Overridable Function Area() As Double54 Return Math.PI * mRadius ^ 255 End Function ' Area56 57 ' return String representation of CCircle458 Public Overrides Function ToString() As String59 60 ' use MyBase reference to return CPoint String representation61 Return "Center= " & MyBase.ToString() & _62 "; Radius = " & mRadius63 End Function ' ToString64 65 End Class ' CCircle4

Page 10: Hoofdstuk 6 – Objectgeoriënteerd Programmeren: Overerving

Visual Basic.NET Pag. 10Hoofdstuk 6: Objectgeoriënteerd programmeren: Overerving

Class CTime inherits existing pieces of class Object.

1 ' Fig. 9.13: CircleTest4.vb2 ' Testing class CCircle4.3 4 Imports System.Windows.Forms5 6 Module modCircleTest47 8 Sub Main()9 Dim circle As CCircle410 Dim output As String11 12 circle = New CCircle4(37, 43, 2.5) ' instantiate CCircle413 14 ' get CCircle4's initial x-y coordinates and radius15 output = "X coordinate is " & circle.X & vbCrLf & _16 "Y coordinate is " & circle.Y & vbCrLf & "Radius is " & _17 circle.Radius18 19 ' set CCircle4's x-y coordinates and radius to new values20 circle.X = 221 circle.Y = 222 circle.Radius = 4.2523 24 ' display CCircle4's String representation25 output &= vbCrLf & vbCrLf & _26 "The new location and radius of circle are " & _27 vbCrLf & circle.ToString() & vbCrLf28 29 ' display CCircle4's diameter30 output &= "Diameter is " & _31 String.Format("{0:F}", circle.Diameter()) & vbCrLf

32

Page 11: Hoofdstuk 6 – Objectgeoriënteerd Programmeren: Overerving

Visual Basic.NET Pag. 11Hoofdstuk 6: Objectgeoriënteerd programmeren: Overerving

Class CTime inherits existing pieces of class Object.

33 ' display CCircle4's circumference34 output &= "Circumference is " & _35 String.Format("{0:F}", circle.Circumference()) & vbCrLf36 37 ' display CCircle4's area38 output &= "Area is " & String.Format("{0:F}", circle.Area())39 40 MessageBox.Show(output, "Demonstrating Class CCircle4")41 End Sub ' Main42 43 End Module ' modCircleTest4

Page 12: Hoofdstuk 6 – Objectgeoriënteerd Programmeren: Overerving

Visual Basic.NET Pag. 12Hoofdstuk 6: Objectgeoriënteerd programmeren: Overerving

6.5 Hiërarchie met overerving op 3 niveaus

• Voorbeeld van overerving: Point-Circle-Cylinder

PointKlasse CPoint bevat instantievariabelen die Private toegankelijk zijn

Ze bevat ook properties X en Y waardoor toegang kan verkregen worden tot mX en mY en methode ToString

CircleKlasse CCircle4 bevat de functionaliteit van CPoint

Ze bevat ook de property voor Radius en de methodes Diameter, Circumference, Area, en ToString

CylinderKlasse CCylinder bevat de functionaliteit van CCircle

Ze bevat ook indirect de klasse CPoint en heeft een CCylinder constructor methode, property Height en methode Volume

Page 13: Hoofdstuk 6 – Objectgeoriënteerd Programmeren: Overerving

Visual Basic.NET Pag. 13Hoofdstuk 6: Objectgeoriënteerd programmeren: Overerving

Class CTime inherits existing pieces of class Object.

1 ' Fig. 9.14: Cylinder.vb2 ' CCylinder class inherits from class CCircle4.3 4 Public Class CCylinder5 Inherits CCircle46 7 Protected mHeight As Double8 9 ' default constructor10 Public Sub New()11 Height = 012 End Sub ' New13 14 ' four-argument constructor15 Public Sub New(ByVal xValue As Integer, _ 16 ByVal yValue As Integer, ByVal radiusValue As Double, _17 ByVal heightValue As Double)18 19 ' explicit call to CCircle4 constructor20 MyBase.New(xValue, yValue, radiusValue)21 Height = heightValue ' set CCylinder height22 End Sub ' New23 24 ' property Height25 Public Property Height() As Double26 27 Get28 Return mHeight29 End Get30 31 ' set CCylinder height if argument value is positive32 Set(ByVal heightValue As Double)33

Page 14: Hoofdstuk 6 – Objectgeoriënteerd Programmeren: Overerving

Visual Basic.NET Pag. 14Hoofdstuk 6: Objectgeoriënteerd programmeren: Overerving

Class CTime inherits existing pieces of class Object.

34 If heightValue >= 0 Then35 mHeight = heightValue36 End If37 38 End Set39 40 End Property ' Height41 42 ' override method Area to calculate CCylinder area43 Public Overrides Function Area() As Double44 Return 2 * MyBase.Area + MyBase.Circumference * mHeight45 End Function ' Area46 47 ' calculate CCylinder volume48 Public Function Volume() As Double49 Return MyBase.Area * mHeight50 End Function ' Volume51 52 ' convert CCylinder to String53 Public Overrides Function ToString() As String54 Return MyBase.ToString() & "; Height = " & mHeight55 End Function ' ToString56 57 End Class ' CCylinder

Page 15: Hoofdstuk 6 – Objectgeoriënteerd Programmeren: Overerving

Visual Basic.NET Pag. 15Hoofdstuk 6: Objectgeoriënteerd programmeren: Overerving

Class CTime inherits existing pieces of class Object.

1 ' Fig. 9.15: CylinderTest.vb2 ' Tests class CCylinder.3 4 Imports System.Windows.Forms5 6 Module modCylinderTest7 8 Sub Main()9 10 ' instantiate object of class CCylinder11 Dim cylinder As New CCylinder(12, 23, 2.5, 5.7)12 Dim output As String13 14 ' properties get initial x-y coordinate, radius and height15 output = "X coordinate is " & cylinder.X & vbCrLf & _16 "Y coordinate is " & cylinder.Y & vbCrLf & "Radius is " & _17 cylinder.Radius & vbCrLf & "Height is " & cylinder.Height18 19 ' properties set new x-y coordinate, radius and height20 cylinder.X = 221 cylinder.Y = 222 cylinder.Height = 1023 cylinder.Radius = 4.2524 25 ' get new x-y coordinate and radius26 output &= vbCrLf & vbCrLf & "The new location, radius " & _27 "and height of cylinder are" & vbCrLf & "Center = [" & _28 cylinder.ToString() & vbCrLf & vbCrLf29 30 ' display CCylinder's diameter31 output &= "Diameter is " & _32 String.Format("{0:F}", cylinder.Diameter()) & vbCrLf33

Page 16: Hoofdstuk 6 – Objectgeoriënteerd Programmeren: Overerving

Visual Basic.NET Pag. 16Hoofdstuk 6: Objectgeoriënteerd programmeren: Overerving

Class CTime inherits existing pieces of class Object.

34 ' display CCylinder's circumference35 output &= "Circumference is " & _36 String.Format("{0:F}", cylinder.Circumference()) & vbCrLf37 38 ' display CCylinder's area39 output &= "Area is " & _40 String.Format("{0:F}", cylinder.Area()) & vbCrLf41 42 ' display CCylinder's volume43 output &= "Volume is " & _ 44 String.Format("{0:F}", cylinder.Volume())45 46 MessageBox.Show(output, "Demonstrating Class CCylinder")47 End Sub ' Main48 49 End Module ' modCylinderTest

Page 17: Hoofdstuk 6 – Objectgeoriënteerd Programmeren: Overerving

Visual Basic.NET Pag. 17Hoofdstuk 6: Objectgeoriënteerd programmeren: Overerving

6.6 Constructors en Finalizers in afgeleide klasses• Constructoren in afgeleide klasses

BasisklasseConstructoren van de basisklasse worden niet overgeërfd door

de afgeleide klasses

Elke constructor van de basisklasse initialiseert de instantie-variabelen van de basisklasse die het object van de afgeleide klasse overerft

• Finalizers in afgeleide klasses

Afgeleide klassesUitvoering van de finalizer methode zou alle bronnen die het

object heeft verworven, moeten vrijmaken voordat de garbage collector het geheugen van dat object terugvraagt

Keyword MyBase wordt gebruikt om de finalizer van de basisklasse op te roepen

Page 18: Hoofdstuk 6 – Objectgeoriënteerd Programmeren: Overerving

Visual Basic.NET Pag. 18Hoofdstuk 6: Objectgeoriënteerd programmeren: Overerving

Class CTime inherits existing pieces of class Object.

1 ' Fig. 9.16: Point3.vb2 ' CPoint3 class represents an x-y coordinate pair.3 4 Public Class CPoint35 6 ' point coordinate7 Private mX, mY As Integer8 9 ' default constructor10 Public Sub New()11 12 ' implicit call to Object constructor occurs here13 X = 014 Y = 015 Console.Writeline("CPoint3 constructor: {0}", Me)16 End Sub ' New17 18 ' constructor19 Public Sub New(ByVal xValue As Integer, _20 ByVal yValue As Integer)21 22 ' implicit call to Object constructor occurs here23 X = xValue24 Y = yValue25 Console.Writeline("CPoint3 constructor: {0}", Me)26 End Sub ' New27 28 ' finalizer overrides version in class Object29 Protected Overrides Sub Finalize()30 Console.Writeline("CPoint3 Finalizer: {0}", Me)31 MyBase.Finalize() ' call Object finalizer32 End Sub ' Finalize33

Page 19: Hoofdstuk 6 – Objectgeoriënteerd Programmeren: Overerving

Visual Basic.NET Pag. 19Hoofdstuk 6: Objectgeoriënteerd programmeren: Overerving

Class CTime inherits existing pieces of class Object.

34 ' property X35 Public Property X() As Integer36 37 Get38 Return mX39 End Get40 41 Set(ByVal xValue As Integer)42 mX = xValue ' no need for validation43 End Set44 45 End Property ' X46 47 ' property Y 48 Public Property Y() As Integer49 50 Get51 Return mY52 End Get53 54 Set(ByVal yValue As Integer)55 mY = yValue ' no need for validation56 End Set57 58 End Property ' Y59 60 ' return String representation of CPoint361 Public Overrides Function ToString() As String62 Return "[" & mX & ", " & mY & "]"63 End Function ' ToString64 65 End Class ' CPoint3

Page 20: Hoofdstuk 6 – Objectgeoriënteerd Programmeren: Overerving

Visual Basic.NET Pag. 20Hoofdstuk 6: Objectgeoriënteerd programmeren: Overerving

Class CTime inherits existing pieces of class Object.

1 ' Fig. 9.17: Circle5.vb2 ' CCircle5 class that inherits from class CPoint3.3 4 Public Class CCircle55 Inherits CPoint3 ' CCircle5 Inherits from class CPoint36 7 Private mRadius As Double8 9 ' default constructor10 Public Sub New()11 12 ' implicit call to CPoint3 constructor occurs here13 Radius = 014 Console.WriteLine("CCircle5 constructor: {0}", Me)15 End Sub ' New16 17 ' constructor18 Public Sub New(ByVal xValue As Integer, _19 ByVal yValue As Integer, ByVal radiusValue As Double)20 21 ' use MyBase reference to CPoint3 constructor explicitly22 MyBase.New(xValue, yValue)23 Radius = radiusValue24 Console.WriteLine("CCircle5 constructor: {0}", Me)25 End Sub ' New26 27 ' finalizer overrides version in class CPoint328 Protected Overrides Sub Finalize()29 Console.Writeline("CCircle5 Finalizer: {0}", Me)30 MyBase.Finalize() ' call CPoint3 finalizer31 End Sub ' Finalize32 33 ' property Radius34 Public Property Radius() As Double35

Page 21: Hoofdstuk 6 – Objectgeoriënteerd Programmeren: Overerving

Visual Basic.NET Pag. 21Hoofdstuk 6: Objectgeoriënteerd programmeren: Overerving

Class CTime inherits existing pieces of class Object.

36 Get37 Return mRadius38 End Get39 40 Set(ByVal radiusValue As Double)41 42 If radiusValue > 043 mRadius = radiusValue44 End If45 46 End Set47 48 End Property ' Radius49 50 ' calculate CCircle5 diameter51 Public Function Diameter() As Double52 Return mRadius * 253 End Function ' Diameter54 55 ' calculate CCircle5 circumference56 Public Function Circumference() As Double57 Return Math.PI * Diameter()58 End Function ' Circumference59 60 ' calculate CCircle5 area61 Public Overridable Function Area() As Double62 Return Math.PI * mRadius ^ 263 End Function ' Area6465 ' return String representation of CCircle566 Public Overrides Function ToString() As String67 68 ' use MyBase reference to return CPoint3 String69 Return "Center = " & MyBase.ToString() & _70 "; Radius = " & mRadius71 End Function ' ToString73 End Class ' CCircle5

Page 22: Hoofdstuk 6 – Objectgeoriënteerd Programmeren: Overerving

Visual Basic.NET Pag. 22Hoofdstuk 6: Objectgeoriënteerd programmeren: Overerving

Class CTime inherits existing pieces of class Object.

1 ' Fig. 9.18: ConstructorAndFinalizer.vb2 ' Display order in which base-class and derived-class constructors3 ' and finalizers are called.4 5 Module modConstructorAndFinalizer6 7 Sub Main()8 Dim circle1, circle2 As CCircle59 10 circle1 = New CCircle5(72, 29, 4.5) ' instantiate objects11 circle2 = New CCircle5(5, 5, 10)12 13 circle1 = Nothing ' mark objects for garbage collection14 circle2 = Nothing15 16 System.GC.Collect() ' request garbage collector to execute17 End Sub ' Main 18 19 End Module ' modConstructorAndFinalizer

CPoint3 constructor: Center = [72, 29]; Radius = 0CCircle5 constructor: Center = [72, 29]; Radius = 4.5CPoint3 constructor: Center = [5, 5]; Radius = 0CCircle5 constructor: Center = [5, 5]; Radius = 10CCircle5 Finalizer: Center = [5, 5]; Radius = 10CPoint3 Finalizer: Center = [5, 5]; Radius = 10CCircle5 Finalizer: Center = [72, 29]; Radius = 4.5CPoint3 Finalizer: Center = [72, 29]; Radius = 4.5

Page 23: Hoofdstuk 6 – Objectgeoriënteerd Programmeren: Overerving

Visual Basic.NET Pag. 23Hoofdstuk 6: Objectgeoriënteerd programmeren: Overerving

6.7 Software engineering met overerving

• Overerving gebruiken om bestaande software aan te passen

Creëren van nieuwe klassesNieuwe klasses erven van oude, reeds bestaande klasses, dus op

deze manier wordt aan hergebruik van software gedaan

Je kunt, naargelang de nood, bijkomende members, properties en methodes toevoegen en members van de basisklasse overriden

Page 24: Hoofdstuk 6 – Objectgeoriënteerd Programmeren: Overerving

Visual Basic.NET Pag. 24Hoofdstuk 6: Objectgeoriënteerd programmeren: Overerving

• Alle icoontjes