VB.NET中泛型的工厂方法

时间:2011-07-20 09:50:25

标签: vb.net generics factory

我想在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)?

1 个答案:

答案 0 :(得分:0)

这是泛型的问题,如果您使用VS 2010,您可能需要查看协方差和逆变,并相应地修改您的IPManagerBase定义。