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:别忘了接受对你最有帮助的答案,并可能对任何你认为值得投票的答案进行投票。