我想在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)?
答案 0 :(得分:0)
这是泛型的问题,如果您使用VS 2010,您可能需要查看协方差和逆变,并相应地修改您的IPManagerBase定义。