我有一个看起来像这样的类对象:
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} }
我的解决方案是否可以从设计角度接受?或者有更好的方法来实现这一目标?
答案 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
。