将继承转换为从C#到VB.NET的接口

时间:2012-01-06 09:28:15

标签: c# vb.net

如何将以下代码转换为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。有什么方法可以更聪明地做到这一点吗?

3 个答案:

答案 0 :(得分: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设为私有。

答案 1 :(得分:0)

您可以使用关键字' 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

答案 2 :(得分:0)

您还可以拥有继承自第一个接口的第二个接口:

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
相关问题