代码之家  ›  专栏  ›  技术社区  ›  Dan Rigby

从泛型基类继承、应用约束并在C中实现接口#

  •  84
  • Dan Rigby  · 技术社区  · 15 年前

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

    这就是我所拥有的:

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

    首先想到的是:

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

    但这是错误的,因为这导致t2需要同时实现IBAR和IFOO,而不是派生的FOO来实现IFOO。

    我试过谷歌搜索、使用冒号、分号等,但我发现不够。我相信答案是非常简单的。

    4 回复  |  直到 7 年前
        1
  •  130
  •   Adam Robinson    15 年前

    在定义泛型约束之前,必须包含类的整个签名。

    class DerivedFoo<T1, T2> : ParentFoo<T1, T2>, IFoo where T2 : IBar
    {
        ...
    }
    
        2
  •  15
  •   Eric Lippert    15 年前

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

    要回答您的特定问题,类声明中的顺序是:

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

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

        3
  •  6
  •   Stan R.    15 年前
    public interface IFoo {}
    public interface IBar {}
    
    public class ParentFoo<T,T1> { }
    public class DerivedFoo<T, T1> : ParentFoo<T, T1>, IFoo where T1 : IBar { }
    
        4
  •  0
  •   user875234    7 年前
    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 如果不提供类型。我没有实现接口,但这不需要任何不同于平常的东西。