具有作为子类中项目列表的属性的类

时间:2019-03-01 22:16:11

标签: vb.net class

我想要一个带文本属性名称的Customer类。 另一个属性CustAddress将是多个地址的列表。 每个地址都有两个字符串属性。

这就是我所拥有的。 我不确定在类地址的构造函数中是否需要某些东西。 而且我什至不确定利用该类的代码是什么样的。

此外,我无法获得F11单步调试功能以单步进入类代码。如果我在类代码中稍作休息,它确实会中断并且工作正常。我已经修改了“仅我的代码”选项以删除复选框,但这无济于事。我有一个包含一个类模块和一个Windows App的解决方案。

<ComClass(ComClass1.ClassId, ComClass1.InterfaceId, ComClass1.EventsId)>
Public Class ComClass1
#Region "COM GUIDs"
    ' These  GUIDs provide the COM identity for this class 
    ' and its COM interfaces. If you change them, existing 
    ' clients will no longer be able to access the class.
    Public Const ClassId As String = "c8e723b4-f229-4368-9737-97c4c71d490a"
    Public Const InterfaceId As String = "16275ddb-5cfe-47c0-995f-84a5f868ad1b"
    Public Const EventsId As String = "dad73a5c-8ac4-4384-a5f9-8e2c388b5514"
#End Region
    ' A creatable COM class must have a Public Sub New() 
    ' with no parameters, otherwise, the class will not be 
    ' registered in the COM registry and cannot be created 
    ' via CreateObject.

    'Fields  
    Private _name As String
    Public _CustAddress As List(Of address)

    'Constructor for class ComClass
    Public Sub New()
        _CustAddress = New List(Of address)
    End Sub

    Public Property CustName() As String
        Get
            Return _name
        End Get
        Set(ByVal Value As String)
            _name = Value
        End Set
    End Property

    Public Property CustAddress() As List(Of address)
        Get
            Return _CustAddress
        End Get
        Set(value As List(Of address))
            _CustAddress = value
        End Set
    End Property

    Public Class address

        Private _address1 As String
        Private _address2 As String

        Public Sub New()
            '??????
        End Sub

        Public Property Address1 As String
            Get
                Return _address1
            End Get
            Set(value As String)
                _address1 = value
            End Set
        End Property

        Public Property Address2 As String
            Get
                Return _address2
            End Get
            Set(value As String)
                _address2 = value
            End Set
        End Property
    End Class

End Class

2 个答案:

答案 0 :(得分:0)

我拿出com东西只是为了缩短答案。由于您在属性过程中没有多余的代码,因此将其简化为自动属性。我还自行将地址类移了出去。此类在程序中的其他地方可能很有用,因此实际上并不需要嵌套类。

Public Class ComClass1
    Public Property CustName As String
    Public Property CustAddress As List(Of address)
    Public Sub New(cName As String, cAddresses As List(Of address))
        CustName = cName
        CustAddress = cAddresses
    End Sub
End Class

Public Class address
    Public Property Address1 As String 'Street Address
    Public Property Address2 As String 'City and State
    Public Sub New(a1 As String, a2 As String)
        Address1 = a1
        Address2 = a2
    End Sub
End Class

Private Sub DeclareAComClass1()
    Dim addrList As New List(Of address) From {
        New address("12 Main Street", "Los Angeles, CA"),
        New address("13 Park Avenue", "New York, NY")
    }
    Dim cc As New ComClass1("Big Company, Inc.", addrList)
End Sub

答案 1 :(得分:0)

这就是我最后得到的。 @玛丽让我遥遥领先。但是因为我使用的是COM类,所以不能有任何带参数的公共构造函数。

我添加了一个名为AddAddress的方法,该方法为我提供了所需的功能。 在我的原始帖子中,我不知何故忽略了COM类所需的MyBase.New。

我鼓励对这种方法有见地的评论。

<ComClass(ComClass1.ClassId, ComClass1.InterfaceId, ComClass1.EventsId)>
Public Class ComClass1
#Region "COM GUIDs"
    ' These  GUIDs provide the COM identity for this class 
    ' and its COM interfaces. If you change them, existing 
    ' clients will no longer be able to access the class.
    Public Const ClassId As String = "c8e723b4-f229-4368-9737-97c4c71d490a"
    Public Const InterfaceId As String = "16275ddb-5cfe-47c0-995f-84a5f868ad1b"
    Public Const EventsId As String = "dad73a5c-8ac4-4384-a5f9-8e2c388b5514"
#End Region
    ' A creatable COM class must have a Public Sub New() 
    ' with no parameters, otherwise, the class will not be 
    ' registered in the COM registry and cannot be created 
    ' via CreateObject.

    'Fields  
    Private _name As String
    Private _CustAddress As List(Of address)

    'Constructor for class ComClass
    Public Sub New()
        MyBase.New
        _CustAddress = New List(Of address)
    End Sub

    Public Sub AddAddress(a1 As String, a2 As String)
        Dim addr As New address(a1, a2)
        _CustAddress.Add(addr)
    End Sub

    Public Property CustName() As String
        Get
            Return _name
        End Get
        Set(ByVal Value As String)
            _name = Value
        End Set
    End Property

    Public Property CustAddress() As List(Of address)
        Get
            Return _CustAddress
        End Get
        Set(value As List(Of address))
            _CustAddress = value
        End Set
    End Property

    Public Class address

        Private _address1 As String
        Private _address2 As String

        Public Sub New(a1 As String, a2 As String)
            _address1 = a1
            _address2 = a2
        End Sub

        Public Property Address1 As String
            Get
                Return _address1
            End Get
            Set(value As String)
                _address1 = value
            End Set
        End Property

        Public Property Address2 As String
            Get
                Return _address2
            End Get
            Set(value As String)
                _address2 = value
            End Set
        End Property
    End Class

End Class

要实现/测试的代码如下:

Dim TestClass As New ComClass1
        Dim myint As Int32

        TestClass.CustName = "John Smith"
        TestClass.AddAddress("123 Main Street", "Los Angeles")

        TestClass.AddAddress("13 Park Avenue", "New York")

        Debug.Print(TestClass.CustAddress(0).Address1)   '123 Main Stree'
        Debug.Print(TestClass.CustAddress(1).Address1)   '13 Park Avenue

        TestClass.CustAddress.Remove(TestClass.CustAddress(0))

        Debug.Print(TestClass.CustAddress(0).Address1)    ' 13 Park Avenue