Demonstrate polymorphism in Point-Circle-Cylinder hierarchy
Imports System
Public Class MainClass
Shared Sub Main(ByVal args As String())
' instantiate Point, Circle and Cylinder objects
Dim point As New Point(7, 11)
Dim circle As New Circle(22, 8, 3.5)
Dim cylinder As New Cylinder(10, 10, 3.3, 10)
' instantiate array of base-class references
Dim arrayOfShapes As CShape() = New CShape(2) {}
' arrayOfShapes(0) refers to Point object
arrayOfShapes(0) = point
' arrayOfShapes(1) refers to Circle object
arrayOfShapes(1) = circle
' arrayOfShapes(2) refers to Cylinder object
arrayOfShapes(2) = cylinder
Console.WriteLine( point.Name & ": " & _
point.ToString() & vbCrLf & circle.Name & ": " & _
circle.ToString() & vbCrLf & cylinder.Name & _
": " & cylinder.ToString() )
Dim shape As CShape
For Each shape In arrayOfShapes
Console.WriteLine( vbCrLf & vbCrLf & shape.Name & ": " & _
shape.ToString() & vbCrLf & "Area = " & _
String.Format("{0:F}", shape.Area) & vbCrLf & _
"Volume = " & String.Format("{0:F}", shape.Volume) )
Next
End Sub
End Class
Public MustInherit Class CShape
' return shape area
Public Overridable Function Area() As Double
Return 0
End Function ' Area
' return shape volume
Public Overridable Function Volume() As Double
Return 0
End Function ' Volume
' overridable method that should return shape name
Public MustOverride ReadOnly Property Name() As String
End Class ' CShape
Public Class Circle
Inherits Point ' Circle Inherits from class Point
Private mRadius As Double
' default constructor
Public Sub New()
' implicit call to Point constructor occurs here
Radius = 0
End Sub ' New
' constructor
Public Sub New(ByVal xValue As Integer, _
ByVal yValue As Integer, ByVal radiusValue As Double)
' use MyBase reference to Point constructor explicitly
MyBase.New(xValue, yValue)
Radius = radiusValue
End Sub ' New
' property Radius
Public Property Radius() As Double
Get
Return mRadius
End Get
Set(ByVal radiusValue As Double)
If radiusValue >= 0 Then ' mRadius must be nonnegative
mRadius = radiusValue
End If
End Set
End Property ' Radius
' calculate Circle diameter
Public Function Diameter() As Double
Return mRadius * 2
End Function ' Diameter
' calculate Circle circumference
Public Function Circumference() As Double
Return Math.PI * Diameter()
End Function ' Circumference
' calculate Circle area
Public Overrides Function Area() As Double
Return Math.PI * mRadius ^ 2
End Function ' Area
' return String representation of Circle
Public Overrides Function ToString() As String
' use MyBase to return Circle String representation
Return "Center= " & MyBase.ToString() & _
"; Radius = " & mRadius
End Function ' ToString
' override property Name from class Point
Public Overrides ReadOnly Property Name() As String
Get
Return "Circle"
End Get
End Property ' Name
End Class
Public Class Cylinder
Inherits Circle ' Cylinder inherits from class Circle
Private mHeight As Double
' default constructor
Public Sub New()
' implicit call to Circle constructor occurs here
Height = 0
End Sub ' New
' four-argument constructor
Public Sub New(ByVal xValue As Integer, _
ByVal yValue As Integer, ByVal radiusValue As Double, _
ByVal heightValue As Double)
' explicit call to Circle constructor
MyBase.New(xValue, yValue, radiusValue)
Height = heightValue ' set Cylinder height
End Sub ' New
' property Height
Public Property Height() As Double
Get
Return mHeight
End Get
' set Cylinder height if argument value is positive
Set(ByVal heightValue As Double)
If heightValue >= 0 Then ' mHeight must be nonnegative
mHeight = heightValue
End If
End Set
End Property ' Height
' override method Area to calculate Cylinder surface area
Public Overrides Function Area() As Double
Return 2 * MyBase.Area + MyBase.Circumference * mHeight
End Function ' Area
' calculate Cylinder volume
Public Overrides Function Volume() As Double
Return MyBase.Area * mHeight
End Function ' Volume
' convert Cylinder to String
Public Overrides Function ToString() As String
Return MyBase.ToString() & "; Height = " & mHeight
End Function ' ToString
' override property Name from class Circle
Public Overrides ReadOnly Property Name() As String
Get
Return "Cylinder"
End Get
End Property ' Name
End Class
Public Class Point
Inherits CShape ' Point inherits from MustInherit class CShape
' point coordinate
Private mX, mY As Integer
' default constructor
Public Sub New()
' implicit call to Object constructor occurs here
X = 0
Y = 0
End Sub ' New
' constructor
Public Sub New(ByVal xValue As Integer, _
ByVal yValue As Integer)
' implicit call to Object constructor occurs here
X = xValue
Y = yValue
End Sub ' New
' property X
Public Property X() As Integer
Get
Return mX
End Get
Set(ByVal xValue As Integer)
mX = xValue ' no need for validation
End Set
End Property ' X
' property Y
Public Property Y() As Integer
Get
Return mY
End Get
Set(ByVal yValue As Integer)
mY = yValue ' no need for validation
End Set
End Property ' Y
' return String representation of Point
Public Overrides Function ToString() As String
Return "[" & mX & ", " & mY & "]"
End Function ' ToString
' implement MustOverride property of class CShape
Public Overrides ReadOnly Property Name() As String
Get
Return "Point"
End Get
End Property ' Name
End Class
Related examples in the same category