【问题标题】:How to create a list of multiple object types and preserve methods/properties?如何创建多个对象类型的列表并保留方法/属性?
【发布时间】:2016-09-22 01:03:09
【问题描述】:

我有一个程序可以反序列化 xml 文件中的内容并用它做各种花哨的事情。我在 XML 文件中有 2 个数组,一个名为 variables,一个名为 lookupTables。我还有 2 个课程,variablelookupTable。这两个类都继承自一个名为definition 的类。 definition 仅继承,并且有一个必须继承的方法,evaluate。代码如下:

定义

Public MustInherit Class Definition

            Public Sub New()
            End Sub

            <XmlAttribute("name")> _
            Public Property name As String

            Public MustOverride Function evaluate(variables As Dictionary(Of String, Double)) As Double

        End Class

变量

<XmlRoot("variable")> _
        Public Class Variable
            Inherits Definition

            <XmlAttribute("value")> _
            Public Property value As String

            Public Overrides Function evaluate(variables As Dictionary(Of String, Double)) As Double
                Dim calculator As CalculationEngine = New CalculationEngine()

                Return calculator.Calculate(value, variables)

            End Function
        End Class

查找表

<XmlRoot("lookupTable")> _
        Public Class LookupTable
            Inherits Definition

            Public Sub New()
            End Sub

            <XmlElement("data")> _
            Public Property data As Integer()()

            Public Overrides Function evaluate(variables As Dictionary(Of String, Double)) As Double
                Return True
            End Function
        End Class

我的问题(希望)非常简单。如何创建Defintions 的列表(即包含VariablesLookupTables 的列表)而不丢失它们各自的方法和属性。我只需要调用evaluate即可使用此列表。

我想我可以创建一个List(Of Definition),因为VariableLookupTable 都保证实现evaluate(),但正如我所读到的,似乎对这两个列表进行类型转换会剥离它们自己的内部结构和只关注Definition 的共同点。我可以在这里做什么?

【问题讨论】:

  • 当您将对象转换为定义时,您失去了对 LookupTables/Variables 类型的访问权限,但您始终可以随时将它们转换回来,以便根据需要访问它们的子类型。

标签: vb.net list class types


【解决方案1】:

由于您的两个对象都从定义继承,您可以创建一个 定义 项目列表,然后当您需要访问特定方法时,您可以使用 directCast 将它们转换为它们的特定类型。要确定类型,可以使用

如果您有多个变量类型不是从同一个基类继承的,您可以创建一个对象列表并应用相同的想法。

'List of definition item
    Private _List As New List(Of Definition)

    'When you want to use specific method, you can cast items back to their types.
    For Each Item As Definition In _List
        Select Case Item.GetType
            Case GetType(LookupTables)
                Dim Table As LookupTables = DirectCast(Item, LookupTables)
                Table.msg() 'Method in my LookupTables class only.
            Case GetType(Variables)
                Dim Variable As Variables = DirectCast(Item, Variables)
                Variable.WriteToConsole() 'Method found in Variables class only.
        End Select
    Next

至于选角, 您可以将 LookupType 转换为定义,反之亦然,以根据需要使用它们各自的方法。

【讨论】:

    【解决方案2】:

    简单的答案是使用ArrayList

    【讨论】:

    • 这个答案完全忽略了OP的问题。
    猜你喜欢
    • 1970-01-01
    • 2020-05-16
    • 1970-01-01
    • 2017-02-13
    • 1970-01-01
    • 2019-02-09
    • 2020-06-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多