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 回答