【问题标题】:Convert inheritance with interface from C# to VB.NET将带有接口的继承从 C# 转换为 VB.NET
【发布时间】:2012-01-06 09:28:15
【问题描述】:

如何将以下代码转换为 VB.NET?

class A
{
    public int NumberA { get; set; }
}

class B : A, I
{
    public int NumberB { get; set; }
}

interface I
{
    int NumberA { get; set; }
    int NumberB { get; set; }
}

在 VB.NET 中,属性声明后的 Implements 关键字存在问题。所以我需要做这样的事情:

Class B
    Inherits A
    Implements IC

    Public Property NumberB() As Integer Implements IC.NumberB
    Get
        Return m_NumberB
    End Get
    Set(ByVal value As Integer)
        m_NumberB = value
    End Set
    End Property
    Private m_NumberB As Integer

    Public Property NumberA1() As Integer Implements IC.NumberA
    Get
        Return MyBase.NumberA
    End Get
    Set(ByVal value As Integer)
        MyBase.NumberA = value
    End Set
    End Property
End Class

但有双重误导属性 NumberA1。有什么方法可以让它更聪明吗?

【问题讨论】:

标签: c# vb.net


【解决方案1】:

是的,vb.net 不支持。与 C# 不同,编译器需要使用显式的 Implements 关键字来实现接口。你能得到的最接近的是:

Interface ICA
    Property NumberA() As Integer
End Interface
Interface ICB
    Property NumberB() As Integer
End Interface

Class A
    Implements ICA
    Public Property NumberA() As Integer Implements ICA.NumberA
        '' etc
    End Property
End Class

Class B
    Inherits A
    Implements ICA, ICB

    Public Property NumberB() As Integer Implements ICB.NumberB
        '' etc...
    End Property
End Class

请注意,B 现在不再需要实现 NumberA,即使它实现了 ICA,A 中的实现也被接受。但这当然需要对原始定义进行太多修改。您使用的解决方法很好,并且在运行时没有不利影响。请注意,您可以将 A1 设为私有。

【讨论】:

  • 这是最好的解决方案。而当 ICB 接口继承了 ICA 之后,一切就完美了。
【解决方案2】:

您可以使用关键字“Shadows”强制隐藏类中的旧属性。

所以也许这对你没问题:

Public Class A

    Public Property NumberA As Integer

End Class

Public Class B
    Inherits A
    Implements I

    Public Shadows Property NumberA As Integer Implements I.NumberA
        Get
            Return MyBase.NumberA
        End Get
        Set(ByVal value As Integer)
            MyBase.NumberA = value
        End Set
    End Property

    Public Property NumberB As Integer Implements I.NumberB

End Class

Interface I
    Property NumberA As Integer
    Property NumberB As Integer
End Interface

【讨论】:

    【解决方案3】:

    你也可以有第二个继承自第一个接口的接口:

    Interface IA
        Property NumberA() As Integer
    End Interface
    
    Interface IB
        Inherits IA
    
        Property NumberB() As Integer
    End Interface
    
    Class A
        Implements IA
    
        Public Property NumberA() As Integer Implements IA.NumberA
            Get
                Return m_NumberA
            End Get
            Set(ByVal value As Integer)
                m_NumberA = value
            End Set
        End Property
        Private m_NumberA As Integer
    End Class
    
    Class B
        Inherits A
        Implements IB
    
        Public Property NumberB() As Integer Implements IB.NumberB
            Get
                Return m_NumberB
            End Get
            Set(ByVal value As Integer)
                m_NumberB = value
            End Set
        End Property
        Private m_NumberB As Integer
    End Class
    

    【讨论】:

      猜你喜欢
      • 2010-09-15
      • 2014-02-18
      • 2011-04-11
      • 2011-01-31
      • 2012-09-04
      • 1970-01-01
      • 2011-10-05
      • 2013-03-31
      • 2011-03-02
      相关资源
      最近更新 更多