w0051977
w0051977

Reputation: 15807

Incompatible interface

Please see the code below:

  Public Class clsCar
        Implements IVehicle
        Public Function getWheels() As Integer Implements IVehicle.getWheels
            Return 4
        End Function
    End Class

    Public Interface IVehicle
        Function getWheels() As Integer
    End Interface

    Public Class Form1
        Private Sub Form1_Load(sender As Object, e As EventArgs) Handles Me.Load
            Dim list As List(Of IVehicle) = New List(Of IVehicle)
            Dim v1 As IVehicle = New clsCar
            Dim v2 As IVehicle = New clsBus
            list.Add(v1)
            list.Add(v2)
            Dim IVehicle As IVehicle = New clsCar
            Dim IVehicle2 As IVehicle = New clsBus
            For Each IVehicle In list
                MsgBox(IVehicle.getWheels())
            Next
        End Sub
    End Class

I want to add a new function to the clsBus class:

Public Function getWheels(ByVal strCarType As String) As Integer
        If strCarType = "Robin Ryliant" Then
            Return 3
        Else
            Return 4
        End If
    End Function

How do I call this from the FOR EACH statement? At the moment it will call getWheels with no arguments.

Upvotes: 0

Views: 62

Answers (3)

Mark
Mark

Reputation: 8160

I think I would go for something more like this, with the number of wheels being an instance property (code in LINQPad format):

Sub Main

    Dim list As List(Of IVehicle) = New List(Of IVehicle)()
    list.Add(New clsCar("Ford Focus", 4))
    list.Add(New clsCar("Robin Ryliant", 3))
    list.Add(New clsBus())
    For Each v In list
        Console.WriteLine(String.Format("{0}:{1}", v.GetVehicleType(), v.GetWheels()))
    Next

End Sub

' Define other methods and classes here

Public Interface IVehicle
    Function GetVehicleType() As String
    Function GetWheels() As Integer
End Interface

Public MustInherit Class clsVehicle
    Implements IVehicle
    Protected Property VehicleType As String
    Protected Property Wheels As Integer
    Protected Sub New(vehicleType As String, wheels As Integer)
        Me.VehicleType = vehicleType
        Me.Wheels = wheels
    End Sub
    Public Function GetVehicleType() As String Implements IVehicle.GetVehicleType
        Return Me.VehicleType
    End Function
    Public Function GetWheels() As Integer Implements IVehicle.GetWheels
        Return Me.Wheels
    End Function
End Class

Public Class clsCar
    Inherits clsVehicle
    Public Sub New(vehicleType As String, wheels As Integer)
        MyBase.New(vehicleType, wheels)
    End Sub
End Class

Public Class clsBus
    Inherits clsVehicle
    Public Sub New()
        MyBase.New("Bus", 4)
    End Sub
End Class

Upvotes: 1

Olivier Jacot-Descombes
Olivier Jacot-Descombes

Reputation: 112372

You will have to add the method overload to the interface in order to be able to call it from a IVehicle variable.

Public Interface IVehicle
    Function getWheels() As Integer
    Function getWheels(ByVal strCarType As String) As Integer
End Interface

But probably it is better to have different, more specialized car types

Public Class clsCar
    Implements IVehicle

    Public Overridable Function getWheels() As Integer Implements IVehicle.getWheels
        Return 4
    End Function
End Class

Public Class clsRobinRyliantCar
    Inherits clsCar

    Public Overrides Function getWheels() As Integer
        Return 3
    End Function
End Class

This does not break the inheritance hierarchy and is purely polymorphic.

Upvotes: 1

Chris
Chris

Reputation: 27609

If your clsBus and clsCar are meant to refer to a specific car then the type should be a member of that class already, not something you pass in when you want to get information. To this end I'd suggest that you have "type" as something you can pass in the constructor and then the method on the bus would have no parameters and would just refer to its internal type to determine how many wheels it has.

I'm not too fluent with VB.NET so would probably make mistakes in example code but hopefully you get what I mean. If not I'll knock up some code. :)

Upvotes: 0

Related Questions