0

インターフェイスに少し問題があります。私のクラスの束は、ILayoutObjectインターフェースを実装しています。メソッドは、変数をILayoutObject(デフォルトでは Nothing として) 宣言し、それをどのオブジェクトにするかを決定するコードを実行します。問題は、変数をパラメーターとして受け取り、それにオブジェクトを割り当てるメソッドで評価コードが実行されることです。オブジェクトの場合、これは問題ありません。オブジェクトはメソッドの変更によって影響を受け、すべて問題ありません。ただし、インターフェイスを使用する場合、呼び出しコード内の変数は残りNothing、通常の変数のように動作します。誰かがそれを回避する方法について何か考えを持っていますか? 残念ながら、コード構造のために、ByRefまたは関数を使用できません:(

ここにいくつかのコードがあります:

Protected LayoutHandler As Dictionary(Of String, Action(Of Constants.OptionsEntryStructure, ILayoutElements)) = New Dictionary(Of String, Action(Of Constants.OptionsEntryStructure, ILayoutElements)) From
    {
    {Constants.KeyLayoutType, AddressOf KeyLayoutType}
    }

Sub MakeLayOuts
    Dim LayoutElement As ILayoutElements = Nothing 
    Dim Value = "SomeValues"
    Dim key = "Key"
    LayoutHandler(key)(Value, LayoutElement)
    ' LayoutElement remains nothing.....
End Sub

Protected Sub KeyLayoutType(elem As Constants.OptionsEntryStructure, Layout As ILayoutElements)
    Layout = New LayoutObject 'which would implement the interface
End Sub
4

1 に答える 1

1

ByRef呼び出しコードの変数が指すオブジェクトを変更する場合と同じように、パラメーターを宣言する必要があります。

Protected Sub KeyLayoutType(elem As Constants.OptionsEntryStructure, ByRef Layout As ILayoutElements)
    Layout = New LayoutObject 'which would implement the interface
End Sub

これは、すべての参照型 (クラス) に当てはまります。それらがインターフェースで参照されているという事実は、違いはありません。

を使用ByRefできず、関数を使用して新しいオブジェクトを返すことができない場合、他の唯一の実際のオプションは、レイアウト オブジェクトをプロパティとして持つオブジェクトのタイプを要求することです。例えば:

Public Interface ILayoutElementContainer
    Public Property LayoutElement As ILayoutElements
End Interface

Protected Sub KeyLayoutType(elem As Constants.OptionsEntryStructure, Container As ILayoutElementContainer)
    Container.LayoutElement = New LayoutObject 'which would implement the interface
End Sub
于 2012-10-08T14:46:56.300 に答える