【问题标题】:What is good practice for abstracting generics?什么是抽象泛型的好习惯?
【发布时间】:2013-06-20 18:20:03
【问题描述】:

考虑以下场景:

Public Class Condition(Of T)

    '...

End Class

现在,我创建了这个类的几个不同类型的实例。我现在希望用这些实例填充一个通用列表。比如:

Dim Conditions As New List(Of Condition....?)
Conditions.add(new Condition(Of String))
Conditions.add(new Condition(Of Double))
Conditions.add(new Condition(Of CustomClass))

最好的方法是什么?现在我正在做以下事情:

Public Class Condition(Of T)
    implements ICondition

    '...

End Class

然后像这样使用它:

Dim Conditions As New List(Of ICondition)
Conditions.add(new Condition(Of String))
Conditions.add(new Condition(Of Double))
Conditions.add(new Condition(Of CustomClass))

但是,ICondition 完全是空的。这让我觉得可能有更好或更被接受的方式来处理事情。我也可以从一个空的基类继承,那会更好吗?做这种事情的首选方法是什么?

我了解,只要包含泛型的列表属于更广泛的类型,我就可以插入任何类型的条件。但是我不想让它超出必要的范围 - 我只想能够插入作为 Public Class Condition(Of T) 实例的对象,但其类型可能会有所不同。

【问题讨论】:

    标签: vb.net generics interface abstraction


    【解决方案1】:

    答案会有所不同,具体取决于您使用的 .NET Framework 版本。查找有关协变逆变的文章以了解问题。 Here's an example.

    .NET 4 和 4.5 支持这种用法。

    .NET 的早期版本会让您使用您提到的 ICondition 接口之类的东西。

    【讨论】:

    • 我知道我可以让我的List(Of Condition..) 更宽泛,类似于List(Of Object),但我想保持类型限制尽可能窄——它们必须从@987654325 实例化@ - 但具有任意类型。我没有从文章中做出正确的暗示吗?
    • 您可能超出了协变和逆变的限制,但我认为您的代码只是一个示例,而不是实际的工作代码。对于协变和/或逆变来帮助您,条件对象中的类型需要是同一继承树的一部分。由于 string、int 和 double 不以这种方式合作(除了它们是对象),您只有 2 个选项 - 在列表中使用 Object,或者在列表中使用 ICondition。
    • 好吧,我知道这可能是一个罕见的例子。该项目是一个有趣的项目;)。到目前为止,这在我的项目中已经出现了两次。但也许是因为我试图强制一个不自然存在的结构。虽然它似乎很适合这个项目,所以我会继续它。谢谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-18
    • 2018-04-07
    • 2020-01-22
    • 1970-01-01
    相关资源
    最近更新 更多