这是两个问题(一个比另一个更具体)。
如果我有这样的方法:
Public Function Blah(String Foo)
End Function
我是否可以根据其他类型限定Foo(例如,我是否可以要求Foo是一个也实现IInterface的String?)。
我在想象一些与此类似的东西:
Public Function Blah(RandomObject Foo Where RandomObject Is IInterface)
End Function
此外,有没有办法限定Type参数?
例如,我可以要求Type I作为参数使用特定的类树吗?
Public Function Blah(Type t Where Type Of String)
End Function
我应该提到我在属性的属性上下文中使用它,因此类声明本身不能是通用的(这完全集中在限定方法参数而不是键入类及其方法)。
答案 0 :(得分:3)
这看起来像是一个泛型的案例。您的方法签名在VB.NET中将是这样的:
Public Function Blah(Of T As {IImplementedByT})(Foo As T)
这指定Foo可以是任何类型T,只要T实现IImplementedByT即可。请注意,此方法可以是通用的,而不需要包含类是通用的。如果您希望T是从RandomClass派生的类,它也实现了此接口,您可以指定两个约束:
Public Function Blah(Of T As {RandomClass, IImplementedByT})(Foo As T)
答案 1 :(得分:1)
您可以先为通用类型执行此操作,但不能为非通用类型执行此操作。基本上变量(包括参数)只能有一个编译时类型,所以你不能说“它必须是Foo
和IBar
- 你必须选择一个或另一个。泛型让你说“它必须是某种类型T
T
派生自Foo
并实现IBar
”。
泛型是一个很大的话题 - 在Stack Overflow答案中无法覆盖 - 但微软有一个good introductory article。
至于你的第二个问题 - 不,你不能这样做。 Type
值仅在执行时已知,因此必须是执行时间检查。您可以使用Type.IsAssignableFrom
轻松地编写该检查。
答案 2 :(得分:0)
不确定你的意思是“Foo是一个也实现了IInterface的字符串”。
字符串类是密封的,所以你不能继承它&因此你无法在它上面实现一个接口。
我希望我在正确的页面上。