如何在项目vb.net中声明两个同名的类

How to declare two classes with the same name in the project vb.net

我从 vb.net 开始并将我的项目 vb6 迁移到 vb.net。 在我的项目中,我在一个文件中有一个名为 A 的 class,声明如下:

Public Class A
.....
End Class

在另一个文件中,我必须声明另一个 class 供本地使用,相同的 class 名称已经在另一个文件 (Class A) 中声明过。 但是两者 class 是不同的。

然后我尝试了以下方法:

Public Class Z
  Private _a As A
    Public Property a () As A
        Get
            Return _a
        Get End
        Set (ByVal value As A)
            _a = value
        End Set
    End Property
End Class Z

Class A
......
End Class

然后我尝试了以下方法:

Public Class Z
  Private _a As A
    Public Property a () As A
        Get
            Return _a
        Get End
        Set (ByVal value As A)
            _a = value
        End Set
    End Property

Class A
......
End Class

End Class Z

需要在实例化 Z 时访问本地 Class A 但是我收到错误消息说:

错误 4 class 'A' 和 class 'A',在命名空间 'BSSystemControl' 中的 'C: \ TFS \ SigaCom \ BsControl System 2014 \ BsSystem \ nfe \ A.vb' 冲突中声明。 C:\TFS\SigaCom\BsControl System 2014\BsSystem\nfe\impostoDevol.VB12 7 BSControl

如果我将 Class A 语句放在 class Z 范围内,我会收到以下消息:

错误 4 'A' 已在此 class 中声明为 'Public Property A The A'。 C:\TFS\SigaCom\BsControl System 2014\BsSystem\nfe\impostoDevol.VB12 11 BSControl

您的成员命名不符合命名约定。私有对象命名应采用驼峰式命名,避免在开始、结束、中间使用“_”字符,public properties ans classes in TitleCase,名称应直观,一种大名的简称。

其次,我认为您所展示的场景根本不需要支持字段。

无论如何,为了解决您刚刚将具有相同 class 名称的每个 class 移动到具有不同名称的不同名称空间的问题,这样您将避免歧义,但这种编程风格不正确。

如果我理解得很好,这就是你的意图吗?:

Public class TopLevelClass

Namespace name1

    Public Class Zclass

        Public Property A As Aclass

        Public Sub New()
            Me.A = New Aclass
        End Sub

        Public NotInheritable Class Aclass
            Public Sub New()
            End Sub
        End Class

    End Class

End Namespace

Namespace name2

    Public Class Zclass

        Public Property A As Aclass

        Public Sub New()
            Me.A = New Aclass
        End Sub

        Public NotInheritable Class Aclass
            Public Sub New()
            End Sub
        End Class

    End Class

End Namespace

End Class

如果您的目标是序列化,那么您的 class 名称在这方面并不重要。默认情况下,当序列化为 XML 时,属性很重要,可以使用 XmlElement(string) 属性覆盖 属性 名称的使用。例如,给定以下结构:

Public Class Z
    Private _a As A2
    <XmlElement("A")> _
    Public Property a () As A2
        Get
            Return _a
        Get End
        Set (ByVal value As A2)
            _a = value
        End Set
    End Property

   Class A2
      '......
   End Class

End Class Z

将序列化为与 XML 相同的:

Public Class Z
    Private _a As A2
    <XmlElement("A")> _
    Public Property ZZZZ () As A2
        Get
            Return _a
        Get End
        Set (ByVal value As A2)
            _a = value
        End Set
    End Property

   Class A2
      '......
   End Class

End Class Z

这也将序列化为与 XML 相同的内容:

Public Class Z
    Private _a As ZZZZ
    <XmlElement("A")> _
    Public Property CDEF () As ZZZZ
        Get
            Return _a
        Get End
        Set (ByVal value As ZZZZ)
            _a = value
        End Set
    End Property

   Class ZZZZ
      '......
   End Class

End Class Z