【问题标题】:Generic type implementing Generic interface syntax?实现通用接口语法的通用类型?
【发布时间】:2014-12-03 22:01:52
【问题描述】:

假设您有如下场景:

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

TLoc 参数是否都继承自 IVehicle?此外,TLoc 之一或两者是否继承自 IMove&lt;TType&gt;

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

问题:您如何区分MyVehicle 继承自什么和TLoc 是什么?

(上下文是现场编造的,试图降低我实际使用的复杂性。泛型参数的语法和功能是我的重点)

【问题讨论】:

  • 只声明了一个TLoc!其他情况参考TLoc 的第一个“提及”,即TLoc 的声明。试试这个就明白了:class MyVehicle&lt;TLoc&gt; : IDrive&lt;TWhatLoc&gt; { ... }
  • 当然,两个类型参数不能同名,所以这也是非法的:class MyVehicle&lt;TLoc, TLoc&gt; { ... }

标签: c# generics inheritance multiple-inheritance


【解决方案1】:

TLoc 参数是否都继承自 IVehicle

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

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

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

【讨论】:

  • 所以如果我希望MyVehicleTLoc 都实现IVehicleIMove&lt;TType&gt; 我会做public class MyVehicle&lt;TType, TLoc&gt; : IVehicle, IMove&lt;TType&gt;, IDrive&lt;TType, TLoc&gt; where TLoc: IVehicle, IMove&lt;TType&gt; 对吗? (我只是想确保我理解,这对我来说是最容易通过示例完成的。我并不是想变得困难:D)
【解决方案2】:

两个 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使用不同的类型。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-11-28
    • 2019-10-15
    • 1970-01-01
    • 2022-11-18
    • 1970-01-01
    • 1970-01-01
    • 2020-03-09
    • 1970-01-01
    相关资源
    最近更新 更多