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
1. | PolyMorphism At Work |