【问题标题】:Implementing inherited abstract member with generic用泛型实现继承的抽象成员
【发布时间】:2011-12-19 21:00:00
【问题描述】:

说我有课:

abstract class A<T> {
    public abstract void foo(T a);
}

class B : A<int> {
    public void foo(int a) {              //ERROR, signature is not correct
}

在这种情况下如何实现基类?参数的类型应该是int。

【问题讨论】:

    标签: c# generics inheritance polymorphism


    【解决方案1】:

    正如其他人指出的那样,您缺少 override 关键字。

    但是,我想提醒您对这种模式要非常小心。如果你不小心,你可能会让自己陷入一个受伤的世界:

    class B<T>
    {
      public virtual void M(T t) {}
      public virtual void M(int x) {}
    }
    class D : B<int>
    {
      public override void M(int x) {}
    }
    

    它覆盖了哪一个?

    这种情况没有任何好处。 CLR 规范建议您永远不要让自己陷入两个方法签名在泛型构造下统一的情况。好建议。

    【讨论】:

    • 你可能认为这是一个愚蠢的例子。但是想象一下你正在实现一个双向字典;你最终可能会这样做:class BiDic&lt;T,U&gt; { public T this[U u] { get { ... } } public U this[T t] { get { ... } } } - 它会起作用 - 只要你不为 TU 使用相同的类型
    【解决方案2】:

    您缺少override 关键字:

    class B : A<int> {
        public override void foo(int a) {
    }
    

    没有override,编译器需要一个不同的签名,期望你声明一个重载

    【讨论】:

      【解决方案3】:

      你需要使用override关键字:

      public override void foo(int a) {;}
      

      【讨论】:

        【解决方案4】:
        abstract class N<T> 
        {
            public abstract void foo(T a);
        }
        
        class B : N<int>
        {
            public override void foo(int a)
            {              
            }
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-04-11
          • 2021-11-18
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多