Mega Code Archive

 
Categories / VB.Net / Class
 

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