Criel
Criel

Reputation: 815

How to instantiate Class object with varying number of property values

Been working a lot with custom classes lately and I love the power you can have with them but I have come across something that I'm not able to solve and/or find anything helpful online.

I have a list of a class with properties I'm looking to only store information pulled from a database into.

Public Class CustomClass

        Public _Values As String
        Public _Variables As String


        Public ReadOnly Property Values() As String
            Get
                Return _Values
            End Get
        End Property

        Public ReadOnly Property Variables() As String
            Get
                Return _Variables
            End Get
        End Property

        Sub New(ByVal values As String, ByVal variables As String)
            _Values = values
            _Variables = variables
        End Sub
End Class

I will be iterating through some database entries, and I'm looking to store them into the appropriate property when I hit them (since I won't have them all available immediately, which is part of my problem). I want to just be able to add either the value or the variable at a time and not both of them, but since I have the sub procedure 'New' passing two arguments, it will always require passing them both. I've found the only way around this is by making them optional fields which I don't feel is the right way to solve this. Is what I'm looking to do possible with a class or would it be simpler by using a structure?

Upvotes: 1

Views: 380

Answers (2)

You can overload the constructor:

Friend Class Foo
    ' using auto-implement props:
    Public Property Name As String      ' creates a _Name backing field
    Public Property Value as Integer

    Public Sub New(newN as String, newV as Integer)
        ' access "hidden" backing fields if you want:
        _Name = newN
        _Value = newV
    End Sub

    Public Sub New()            ' simple ctor
    End Sub

    Public Sub New(justName As String)
        ' via the prop
        Name = justName
    End Sub
End Class

You now have 3 ways to create the object: with full initialization, partial (name only) or as a blank object. You will often need a "simple constructor" - one with no params - for other purposes: serializers, Collection editors and the like will have no idea how to use the parameterized constructors and will require a simple one.

If rules in the App were that there was no reason for a MyFoo to ever exist unless both Name and Value being defined, implementing only the New(String, Integer) ctor enforces that rule. That is, it is first about the app rules, then about coding convenience.

Dim myFoo As New Foo         ' empty one
myFoo.Name = "ziggy"         ' we only know part of it

Upvotes: 1

Steve
Steve

Reputation: 5545

Since the default of string is nothing, you could pass nothing for the value you don't have. IE

Collection.Add(New CustomClass("My Value",Nothing))

Every type has a default, so this works with more than just strings.

Upvotes: 0

Related Questions