2016-05-24 13 views
0

私は、xmlファイルから項目をデシリアライズし、すべての種類の素晴らしいことを行います。私はXMLファイルに2つの配列を持っています。一つはvariables、もう一つはlookupTablesです。私はまた、2クラス、variablelookupTableを持っています。これらのクラスはどちらもdefinitionというクラスから継承しています。 definitionは継承され、継承する必要のあるメソッドが1つあります(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 

私の質問は、(うまくいけば)非常に簡単です。 Defintionのリスト(したがって、VariablesLookupTablesの両方を含むリスト)を個々のメソッドとプロパティを失うことなく作成するにはどうすればよいですか。このリストを使用するために必要なのは、evaluateです。

私は VariableLookupTable両方が evaluate()を実装するために保証されているが、私は読んで、リストの両方を型キャストすると、自分の内臓のそれらを除去し、 Definitionと共通である何onluy続けるだろうと思われるので、私はちょうど List(Of Definition)を作成できると思っていた

。私はここで何ができますか?

+0

オブジェクトを定義にキャストしている間は、LookupTables/Variablesタイプへのアクセスが緩いですが、いつでもそれらをキャストして、必要に応じていつでも子タイプとしてアクセスできます。 –

答えて

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をキャストすることができます。

-1

簡単な答えはArrayListです。

関連する問題