【发布时间】:2011-07-20 09:50:25
【问题描述】:
我想在 VB.NET 中为泛型类创建一个工厂,但我遇到了问题。
我有两个接口: IPersistentObject 和 IPManagerBase(Of T as IPersistentObject)
逻辑是,对于每种类型的持久对象,我都有一个相应的管理器类处理查询逻辑。
现在我有一个这样的基类:
public class PManagerBase(Of T as IPersistentObject) Implements IPManagerBase(of T)
所以,现在在现实世界中,我有一个持久类型“PUser”和一个相应的管理器,声明如下:
public class PUserManager implements PManagerBase(Of PUser)
我有大约 100 个这样的持久对象和相应的管理器类。
现在我想要一个工厂,我会像这样调用它(删除细节):
MyFactory.CreateManager<PUserManager>()
我正在像这样创建我的工厂
public class MyFactory
public shared function CreateManager(Of T as {PManagerBase(Of IPersistentObject), New}) as T
return new T()
end function
end class
看起来很棒。
现在我想调用它:
Dim myManager = MyFactory.CreateManager<PUserManager>()
会发生什么? 我收到一个编译错误:“PUserManager 没有实现/继承 PManagerBase(Of IPersistentObject)”。我收到的是德语信息,所以这是免费翻译。
我需要进行哪些更改才能使其运行? 如果我这样声明我的工厂,它会起作用:
public class MyFactory
public shared function CreateManager(Of T as {PManagerBase(Of PUser), New}) as T
return new T()
end function
end class
但是好处就没有了,因为它只适用于 PUser 对象的管理器。
更好的解决方案是
public class MyFactory
public shared function CreateManager(Of T as {PManagerBase(Of U), New}, U as IPersistentObject) as T
return new T()
end function
end class
这可行,但我现在必须像这样调用我的工厂方法:
Dim myManager = MyFactory.CreateManager<PUserManager, PUser>()
我不喜欢这样,因为这是多余的,而且我在函数中根本不需要 U。在它的声明中,PUserManager 与 PUser 绑定。
有没有更好的方法?为什么 PUserManager 不继承自 PManagerBase(Of IPersistentObject)?
【问题讨论】: