引用相同对象类型的另一个对象实例的类对象属性

时间:2019-10-09 15:20:41

标签: vb.net

我有一个看起来像这样的类对象:

Public Class item
    Public Property ID
    Public Property Name
    Public Property Description
    Public Property Type
    Public Property Alias
End Class

我目前将它们存储为这样的字典:

Public Class Items

    Public ReadOnly dict Dictionary(Of String, item) From {
        {"A", New item With {.Name = "Object A", .Description = "Object A description"}},
        {"B", New item With {.Name = "Object B", .Description = "Object B description"}},
        {"C", New item With {.Alias = "A"}}
    }

    Public Function GetItem(ByVal ID As String) As item
        Return If(dict.ContainsKey(ID), idct.Item(ID), Nothing)
    End Function

End Class

复杂之处在于,有时item本身不会具有任何属性,而是具有一个.Alias属性,该属性表示“我的所有属性都与具有该ID的item相同,而是检查该对象。”

我应该如何编写类对象item,以便此代码返回“ Object A”:

Dim newItem As item = GetItem("C")
Debug.WriteLine(item.Name)

对象C是对象A的别名,因此我应该为对象A而不是Nothing返回一些属性(并非总是全部)。

一种解决方法是将以下函数添加到Items类中:

Public Function GetItemDescription(ByVal ID As String) As String
    If dict.ContainsKey(ID) Then
        If dict.Item(ID).Description = "" Then
            Return GetItemDescription(dict.Item(ID).Alias)
        Else
            Return dict.Item(ID).Description
        End If
    Else
        Return ""
    End If
End Function

但是,这并不像是正确的方法,因此我不得不反复调用一组Items.GetPropertyXYZ函数,而不是直接引用该对象(例如item.Description必须是{{1} }

我的解决方案是否可以从设计角度接受?或者有更好的方法来实现这一目标?

2 个答案:

答案 0 :(得分:1)

尝试一下:

num1 = int(input("Enter a number"))
operator = input("Now enter an operator")
num2 = int(input("Enter a new number"))
Pow = (num1*num1)
if operator == "^":
    print(Pow)
    while num1 < num2:
        Pow = num1 * num1
        num2 += 1

编辑1

当然,由于错误,它会返回“ C”项目。抱歉。

此作品有效(已测试):

Public Function GetItem(ByVal [alias] As String) As item
    Return dict.Where(Function(a) a.Key = [alias]).Select(Function(b) b.Value).FirstOrDefault
End Function

答案 1 :(得分:0)

JQSOFT的答案的确实现了类似的目的,但是自那以后,我实现了一种更细粒度的方法来实现相同的结果。

Private Property _description As String
Public Property Description As String
    Get
        If _Description = "" Then
            If [Alias] IsNot Nothing Then
                Return dict.Item([Alias]).Description
            Else
                Return ""
            End If
        Else
            Return _description 
        End If
    End Get
    Set(value As String)
        _description = value
    End Set
End Property

通过这种方式,我可以指定是否在属性级别从Object A返回数据,而不是返回完全不同的对象。

此外,.Alias是一个糟糕的属性名称,因为它也是一个关键字,我将使用.Synonym