Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vb.net/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Vb.net 运行时导入是否可能?_Vb.net - Fatal编程技术网

Vb.net 运行时导入是否可能?

Vb.net 运行时导入是否可能?,vb.net,Vb.net,我将尽可能清楚地解释这个问题。我不确定我所需要的是否可能,但我希望一定有解决办法。我将无法在这里输入实际代码,但将添加解释问题所需的任何内容 最初我们有两个独立的类,定义如下 Imports QMember48 Public Class Member48 Public Function ProcessInfo(reqctx as Member48.RequestContext, memid as String) 'Code here End Function Public Func

我将尽可能清楚地解释这个问题。我不确定我所需要的是否可能,但我希望一定有解决办法。我将无法在这里输入实际代码,但将添加解释问题所需的任何内容

最初我们有两个独立的类,定义如下

Imports QMember48

Public Class Member48

 Public Function ProcessInfo(reqctx as Member48.RequestContext, memid as String)
 'Code here
 End Function

 Public Function UpdateInfo(partner as Member48.Partner, memid as String)
 'Code here
 End Function

 'Other methods and functions come here

End Class

Imports QMember50

Public Class Member50

 Public Function ProcessInfo(reqctx as Member50.RequestContext, memid as String)
 'Code here
 End Function

 Public Function UpdateInfo(partner as Member50.Partner, memid as String)
 'Code here
 End Function

 'Other methods and functions come here

End Class
基本上,这两个类有共同的方法和函数,但引用不同

接下来,我们决定创建一个工厂模式,根据一些输入参数获取这些类的对象

我们当前的代码实现如下所示:

'Base class definition
Imports QMember48

Public MustInherit Class Member
 Public MustOverride Function ProcessInfo(reqctx as Member48.RequestContext, memid as String)
 Public MustOverride Function UpdateInfo(partner as Member48.Partner, memid as String)
End Class

'Factory
Public Module MemFactory

 Function GetMember(val as string) as Member
  'Do some processing here
  If val = "500" return new Member50() else return new Member48()
 End Function

End Module
问题是基类引用Member48,当工厂为Member50生成对象时,对Member48的引用仍然保留。这需要在基类中以某种方式进行更正。如果需要Member50的对象,则不应引用Member48。但是,在没有任何硬编码的Member48/50导入的情况下,我们如何定义基类呢

有没有办法解决这个问题?如果需要更多细节,我可以稍后添加


谢谢。

问题是两个
成员没有任何共同的方法。可能有两个方法具有相同的名称,但这些方法具有不同的签名。您既不能将
Member48.RequestContext
传递给
Member50
,也不能将
Member50.RequestContext
传递给
Member48
。这就是为什么继承不能在这里合理应用的原因。两个成员的公共基类都将为空

您可以使用通用基类,如下所示:

MustInherit Class Member(Of TRequest, TPartner)
    Public MustOverride Function ProcessInfo(reqctx As TRequest, memid As String)
    Public MustOverride Function UpdateInfo(partner As TPartner, memid As String)
End Class

Class Member48
    Inherits Member(Of QMember48.RequestContext, QMember48.Partner)
    '...
End Class

Class Member50
    Inherits Member(Of QMember50.RequestContext, QMember50.Partner)
    '...
End Class
然而,这个基类并没有给你工厂带来任何好处。工厂将不得不返回一个非类型化的
成员
,您将失去通用实现的任何优势

另一种方法是尝试统一
请求上下文
合作伙伴
。如果成员只依赖于普通成员,那么使用接口就可以很容易地做到这一点。如果没有公共成员,您甚至可以使用空接口(作为请求类型的提示)并执行以下操作:

MustInherit Class Member
    Public MustOverride Function ProcessInfo(reqctx As IRequestContext, memid As String)
    '...
End Class
具体的
成员将负责检查正确的类型,如果传递了错误的类型,则可能引发异常

最后一种方法是不使用任何基类,让工厂返回一个
对象
(或者可能是一个空基类)。这可能是最干净的解决方案,因为它不会在没有人工继承的地方引入任何人工继承。当然,每次访问对象时都必须进行类型检查,但大多数其他方法也是如此


最后,对于你的问题没有一个好的解决方案。也许您可以修改您的架构,看看是否有更智能的结构,或者您是否真的需要上面列出的
成员。

RequestContext
合作伙伴创建基类或接口,并让
Member48.RequestContext
/
Member50.RequestContext
Member48.Partner
/
Member50.Partner
实现这些接口:

Public Interface IRequestContext
End Interface

Public Interface IPartner
End Interface

Class Member48RequestContext
    Implements IRequestContext
End Class

Class Member48Partner
    Implements IPartner
End Class

Class Member50RequestContext
    Implements IRequestContext
End Class

Class Member50Partner
    Implements IPartner
End Class
现在,您可以创建一个基类,该基类接受
IRequestContest
IPartner

Public MustInherit Class Member
    Public MustOverride Function ProcessInfo(reqctx as IRequestContext, memid as String)
    Public MustOverride Function UpdateInfo(partner as IPartner, memid as String)
End Class
具体成员类的实现如下所示

Public Class Member50
    Inherits Member

    Public Overrides Function ProcessInfo(reqctx as IRequestContext, memid as String)
    End Function

    Public Overrides Function UpdateInfo(partner as IPartner, memid as String)
    End Function

End Class
如果需要,还可以使用泛型创建另一个子类:

Public MustInherit Class Member(Of TRequest As IRequestContext, TPartner As IPartner) 
    Inherits Member

    Public Overrides Function ProcessInfo(reqctx as IRequestContext, memid as String)
        Return ProcessInfo(DirectCast(reqctx, TRequest), memid)
    End Function

    Public Overrides Function UpdateInfo(partner as IPartner, memid as String)
        Return UpdateInfo(DirectCast(partner, TPartner), memid)
    End Function

    Public Overloads MustOverride Function ProcessInfo(reqctx as TRequest, memid as String)
    Public Overloads MustOverride Function UpdateInfo(partner as TPartner, memid as String)
End Class
以及一项实施:

Public Class Member48
    Inherits Member(Of Member48RequestContext, Member48Partner) 

    Public Overrides Function ProcessInfo(reqctx as Member48RequestContext, memid as String)
    End Function

    Public Overrides Function UpdateInfo(partner as Member48Partner, memid as String)
    End Function

End Class
注意
Member48
如何只接受
Member48RequestContext
,而不是像
Member50
这样的任何
IRequestContext
。这取决于你是否想要额外的安全

工厂方法保持不变:

Function GetMember(val as string) as Member
    'Do some processing here
    If val = "500" Then
        Return New Member50()
    Else 
        Return New Member48()
    End If      
End Function
但是,您的工厂仍然需要引用
Member50
Member48
,因为它创建了具体的类


另一种方法是使用DI容器,如,它能够自动扫描所有程序集,以查找实现
成员(TRequest作为IRequestContext,TPartner作为IPartner)的所有类型
,为每个组件指定一个密钥,并在要求指定密钥(例如500)时返回正确的实例,例如
Member50
。但这样一个完整的配置示例将超出此问题/答案的范围。

感谢大家在这方面的帮助。我尝试了多米尼克建议的过程,这对我帮助很大。再次感谢。@abanerjee:别忘了接受对你最有帮助的答案,并可能对任何你认为值得投票的答案进行投票。