【问题标题】:C# override an abstract method of generic typeC# 重写泛型类型的抽象方法
【发布时间】:2014-09-11 06:09:23
【问题描述】:

我做了很多搜索,我认为我得到了正确的模式,但它仍然没有编译,我真的很感谢你的帮助......

我有一个通用类:

public abstract class CTopology<TTopology>
{
    protected abstract TTopology Pcalc();
    public TTopology PLosses()
    { do something
      return this.PCalc()
    }

然后是派生类

   public class CInverter : CTopology<CPBoost>
    { 
     protected override CPInv PCalc()
        {
         CPInv Calc = new CPInv();
         do something
         return Calc;
        }
     }

现在我得到了这两个编译错误:

错误 1 ​​'iSine46.CInverter' 没有实现继承的抽象成员 'iSine46.CTopology.Pcalc()'

错误 2 'iSine46.CInverter.PCalc()': 找不到合适的方法来覆盖

【问题讨论】:

  • Visual Studio 有一个智能感知功能可以帮助解决这个问题。在派生类中,输入“override PCalc”并回车。 Visual Studio 将使用正确的修饰符放入正确的方法或属性。

标签: c# generics methods overriding abstract


【解决方案1】:

您的覆盖方法与基类提供的结果类型不同。您需要返回一个 CPBoost 实例:

public class CInverter : CTopology<CPBoost> { 
    protected override CPBoost PCalc() { ... }
    ...
}

【讨论】:

    【解决方案2】:
    public abstract class CTopology<TTopology>
    {
      protected abstract TTopology Pcalc();
    }
    
    
    public class CInverter : CTopology<CPBoost>
    { 
      // note that the return type is of the type you chose for TTopology
      // and the capitalization is correct
      protected override CPBoost Pcalc() 
      {
         return something;
      }
    }
    

    【讨论】:

      【解决方案3】:

      错误的原因是你应该保留方法的签名

      public abstract class CTopology<TTopology> {
        // Returns TTopology
        protected abstract TTopology Pcalc();
        ...
      }
      
      public class CInverter : CTopology<CPBoost> { 
        // Should also return TTopology, that is CPBoost in the case and not CPInv!
        protected override CPBoost PCalc() {
          ...
        }
        ...
      }
      

      【讨论】:

      • 我试过了,但我得到了这个错误:错误 1 ​​找不到类型或命名空间名称“TTopology”(您是否缺少 using 指令或程序集引用?)
      【解决方案4】:
      public class CInverter : CTopology<CPBoost> { 
      // You should return TTopology instead of CPInv
          protected override CPBoost PCalc() {
          ....
          }
      
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-10-10
        • 2012-03-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多