从通用基类继承,应用约束,并在C#中实现接口

时间:2010-01-05 16:28:36

标签: c# generics inheritance interface constraints

这是一个语法问题。我有一个泛型类,它继承自泛型基类,并将约束应用于其中一个类型参数。我还希望派生类实现一个接口。对于我的生活,我似乎无法弄清楚正确的语法。

这就是我所拥有的:

DerivedFoo<T1,T2> : ParentFoo<T1, T2> where T2 : IBar { ... }

首先想到的是:

DerivedFoo<T1,T2> : ParentFoo<T1, T2> where T2 : IBar, IFoo { ... }

但这是不正确的,因为这导致T2需要实现IBar和IFoo,而不是DerivedFoo来实现IFoo。

我尝试了一些谷歌搜索,使用冒号,分号等,但我已经做空了。我确定答案很简单。

4 个答案:

答案 0 :(得分:137)

在定义通用约束之前,请包含类的完整签名。

class DerivedFoo<T1, T2> : ParentFoo<T1, T2>, IFoo where T2 : IBar
{
    ...
}

答案 1 :(得分:16)

我的建议:当您对C#语言的语法有疑问时,请阅读规范;这就是我们发布它的原因。您需要阅读第10.1节。

要回答您的具体问题,班级声明中的事物顺序为:

  • 属性,方括号
  • 修饰符(“public”,“static”等)
  • “部分”
  • “类”
  • 班级名称
  • 尖括号内的逗号分隔的类型参数声明列表
  • 冒号后面跟着一个以逗号分隔的基类型列表(基类和实现的接口,如果有基类,必须先删除基类)
  • 类型参数约束
  • 班级的主体,被大括号包围
  • 分号

该列表中的所有内容都是可选的,但“class”,名称和正文除外,但如果出现,则所有内容都必须按顺序显示。

答案 2 :(得分:6)

public interface IFoo {}
public interface IBar {}

public class ParentFoo<T,T1> { }
public class DerivedFoo<T, T1> : ParentFoo<T, T1>, IFoo where T1 : IBar { }

答案 3 :(得分:2)

public class KeyAndValue<T>
{
    public string Key { get; set; }
    public virtual T Value { get; set; }
}

public class KeyAndValue : KeyAndValue<string>
{
    public override string Value { get; set; }
}

这是现有答案的扩展。如果您不提供类型,则默认为string。我没有实现接口,但是不需要任何不同于平常的东西。