我的界面有点问题。我的一堆类实现了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
答案 0 :(得分: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