首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >不兼容接口

不兼容接口
EN

Stack Overflow用户
提问于 2014-06-09 15:38:41
回答 3查看 60关注 0票数 0

请参阅以下代码:

代码语言:javascript
复制
  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

我想向clsBus类添加一个新函数:

代码语言:javascript
复制
Public Function getWheels(ByVal strCarType As String) As Integer
        If strCarType = "Robin Ryliant" Then
            Return 3
        Else
            Return 4
        End If
    End Function

如何从每条语句中调用这一项?目前,它将调用没有参数的getWheels。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-06-09 15:53:44

如果您的clsBus和clsCar是指特定的car,那么类型应该已经是该类的成员,而不是当您想获得信息时传入的东西。为此,我建议您将" type“作为可以在构造函数中传递的内容,然后总线上的方法将没有参数,只会引用其内部类型来确定它有多少个轮子。

我不太熟悉VB.NET,所以可能会在示例代码中出错,但希望您理解我的意思。如果没有,我会编一些密码。:)

票数 0
EN

Stack Overflow用户

发布于 2014-06-09 15:46:58

您必须将方法重载添加到接口中,以便能够从IVehicle变量调用它。

代码语言:javascript
复制
Public Interface IVehicle
    Function getWheels() As Integer
    Function getWheels(ByVal strCarType As String) As Integer
End Interface

但是也许有不同的,更专业的汽车类型更好。

代码语言:javascript
复制
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

这不会破坏继承层次结构,而纯粹是多态的。

票数 1
EN

Stack Overflow用户

发布于 2014-06-09 16:03:06

我想我会选择更像这样的东西,轮子的数目是一个实例属性( LINQPad格式的代码):

代码语言:javascript
复制
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
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24123718

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档