【问题标题】:Factory method for generics in VB.NETVB.NET中泛型的工厂方法
【发布时间】: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)?

【问题讨论】:

    标签: vb.net generics factory


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-16
      • 2011-03-23
      • 2011-12-22
      • 1970-01-01
      相关资源
      最近更新 更多