2014-12-03 127 views
1

假设你有一个像下面这样的场景:实现通用接口语法的泛型类型?

public class MyVehicle<TType, TLoc> : IDrive<TType, TLoc> where TLoc: IVehicle, IMove<TType> 

做既TLoc参数从IVehicle继承?此外,一个或两个TLoc继承自IMove<TType>

如果两个参数TLoc都不从IVehicle继承我该如何正确声明?

问题:你怎么什么MyVehicle从继承和什么TLoc是区分?

(上下文是在试图减少对我的实际使用的复杂性做出了当场。泛型参数的语法和功能是我的重点)

+0

只有一个TLoc声明!其他情况参考了'TLoc'的​​第一个“提及”,它是“TLoc”的声明。试试这个来明白:'class MyVehicle :IDrive {...}' – 2014-12-03 23:03:06

+0

和两个类型参数不能有相同的名字,当然这样也是非法的:'class MyVehicle {...}' – 2014-12-03 23:10:11

回答

1

做既TLoc参数继承从IVehicle

只有一个TLoc参数,它只用在两个地方。因此,第二类型参数MyVehicle和第二类型参数IDrive将从IVehicle派生,因为它们都将引用相同的类型。从IMove<TType>继承同样如此。

如何区分MyVehicle是继承和什么TLoc是什么?

MyVehicle类实现了一个用两个类型参数实例化的通用接口。 TLoc恰好是这些类型参数之一。

+0

所以如果我希望'MyVehicle'和'TLoc'实现'IVehicle'和'IMove '我会做'公共类MyVehicle :IVehicle,IMove ,IDrive 其中TLoc:IVehicle,IMove '正确吗? (我只是想确保我明白,这对我来说很容易通过例子完成,我并不想这么困难:D) – Shelby115 2014-12-04 04:30:20

+0

@ Shelby115是的,这是正确的。 – dasblinkenlight 2014-12-04 10:24:14

1

这两个TLoc参数是否都继承自IVehicle?

从技术上讲,TLoc必须是实现IVehicle的类型或从其“继承”的其他接口。但是,我以你的方式向你提出“继承”,然后是的;实际上它们必须是相同的类型。

此外,一个或两个TLoc是否从IMove继承?

这两个,在你的意思是“继承”。

如果两个TLoc参数都不能从IVehicle继承我该如何正确声明它?

那么只有一个TLoc所以我不确定你的意思。您不能在类和它实现的接口中使用不同的通用参数。

你可以一个额外泛型参数添加到类:

public class MyVehicle<TType, TLoc1, TLoc2> 
    : IDrive<TType, TLoc1> 
    where TLoc1: IVehicle, IMove<TType> 
    where TLoc2: IVehicle, IMove<TType> 

然后你可以使用不同类型TLoc1TLoc2