|
Dit artikel is gepubliceerd op zondag 31 juli 2011 op vbvoorbeelden, bezoek de website voor een recente versie van dit artikel of andere artikels.
23.2.1. IComparable InterfaceOok interfaces kunnen generiek worden opgesteld.
Onderstaande abstracte klasse Figure implementeert de interface IComparable om te garanderen dat we verschillende Figure objecten met elkaar kunnen vergelijken.
Deze interface vereist een implementatie voor de CompareTo(obj As Object) As Integer method. Visual Basic 2010 Broncode Option Strict OnOption Explicit OnNamespace Example1 MustInherit Class Figure : Implements IComparable Public MustOverride Function GetArea() As Double Private Function CompareTo( ByVal obj As Object) As Integer _ Implements System.IComparable. CompareTo If Not TypeOf obj Is Figure Then Throw New ArgumentException( "An invalid argument was " & _ "specified. An argument of type Figure is required.") Else CompareTo = CompareTo( DirectCast(obj, Figure)) End If End Function Public Function CompareTo( ByVal other As Figure) As Integer If other IsNot Nothing Then CompareTo = 1 Else CompareTo = Me.GetArea().CompareTo(other.GetArea()) End If End Function Public Overrides Function ToString() As String ToString = GetArea.ToString() End Function End ClassEnd NamespaceDownload Visual Basic 2010 Broncode Download Visual C# Sourcecode
In bovenstaande klasse Figure hebben we private implementation toegepast om te vermijden dat een niet typesafe method CompareTo(ByVal obj As Object) aan de publieke interface werd toegevoegd. Een strongly typed variatie CompareTo(ByVal figure As Figure) werd dan wel opgenomen.
Concrete klassen Square en Circle worden van Figure afgeleid, en zijn hierdoor verplicht een implementatie te voorzien voor de Area property : Visual Basic 2010 Broncode Namespace Example1 Class Square : Inherits Figure Private m_Side As Double Public Property Side() As Double Get Side = m_Side End Get Set( ByVal Value As Double) m_Side = Value End Set End Property Public Overrides Function GetArea() As Double GetArea = Side ^ 2 End Function End Class Class Circle : Inherits Figure Private m_Radius As Double Public Property Radius() As Double Get Radius = m_Radius End Get Set( ByVal Value As Double) m_Radius = Value End Set End Property Public Overrides Function GetArea() As Double GetArea = Radius ^ 2 * System.Math.PI End Function End ClassEnd NamespaceDownload Visual Basic 2010 Broncode Download Visual C# Sourcecode
Onderstaande client toont ons hoe de compiler ons verhindert concrete Figure objecten te gaan vergelijken met niet Figure objecten (1). De publieke interface van Figure voorziet immers enkel in een CompareTo met een Figure argument, waardoor we dus enkel Figures onderling kunnen vergelijken. Visual Basic 2010 Broncode Namespace Example1 Class Client Public Shared Sub Main() Dim figure1 As Figure = New Square With {.Side = 2} Dim figure2 As Figure = New Circle With {.Radius = 1} Console.WriteLine(figure1.CompareTo(figure2)) Console.ReadLine() End Sub End ClassEnd NamespaceDownload Visual Basic 2010 Broncode Download Visual C# Sourcecode
Console Application Output 1 boven
23.2.2. IComparable(Of T) InterfaceDeze constructie ( private implementation en het toevoegen van een typesafe versie ) kan worden vereenvoudigd door de generieke versie IComparable(Of T) van de interface IComparable te gaan implementeren.
Als we Figure als actuele generieke parameter gebruiken, zal een generieke instantie worden geïmplementeerd die meteen een implementatie vereist voor een CompareTo method met argument van het type Figure : Visual Basic 2010 Broncode Namespace Example2 MustInherit Class Figure : Implements IComparable( Of Figure) Public MustOverride Function GetArea() As Double Public Function CompareTo( ByVal other As Figure) As Integer _ Implements IComparable( Of Figure).CompareTo CompareTo = Me.GetArea().CompareTo(other.GetArea()) End Function End Class Class Square : Inherits Figure Private m_Side As Double Public Property Side() As Double Get Side = m_Side End Get Set( ByVal Value As Double) m_Side = Value End Set End Property Public Overrides Function GetArea() As Double GetArea = Side ^ 2 End Function End Class Class Circle : Inherits Figure Private m_Radius As Double Public Property Radius() As Double Get Radius = m_Radius End Get Set( ByVal Value As Double) m_Radius = Value End Set End Property Public Overrides Function GetArea() As Double GetArea = Radius ^ 2 * System.Math.PI End Function End Class Class Client Public Shared Sub Main() Dim figure1 As Figure = New Square With {.Side = 2} Dim figure2 As Figure = New Circle With {.Radius = 1} Console.WriteLine(figure1.CompareTo(figure2)) Console.ReadLine() End Sub End ClassEnd NamespaceDownload Visual Basic 2010 Broncode Download Visual C# Sourcecode
Console Application Output 1
Dit artikel is gepubliceerd op zondag 31 juli 2011 op vbvoorbeelden, bezoek de website voor een recente versie van dit artikel of andere artikels.
|