【问题标题】:c# inherits an Interface with a derivate class in a method's parametersc# 在方法的参数中继承一个带有派生类的接口
【发布时间】:2015-11-24 15:24:53
【问题描述】:

我有一个这样的抽象类:

public abstract class BaseClass
{
   ...
}

然后我有很多派生自BaseClass的类:

public class DerivedOne : BaseClass
{
    ...
}

我需要实现一个接口来管理实现一个方法的可能性,该方法可以使用从BaseClass 派生的所有类,例如参数:

public interface IErrorParser
{
    List<string> ParseErrorMessage(BaseClass base);
}

此时,如果我尝试从接口开始实现一个类,以这种方式

public class FirstParser: IErrorParser
{
     public List<string> ParseErrorMessage(DerivedOne derived)
     {
        ...
     }
}

我收到错误:

FirstParser 没有实现接口成员 'IErrorParser.ParseErrorMessage(BaseClass)'

此时我认为我需要使用泛型...但我无法理解如何...

【问题讨论】:

  • 看起来你可能想让你的界面通用。

标签: c# generics inheritance abstract-class


【解决方案1】:

像这样使IErrorParser 接口通用:

public interface IErrorParser<T> where T:BaseClass 
{
    List<string> ParseErrorMessage(string defaultMessage, T service);
}

然后你可以像这样实现它:

public class FirstParser: IErrorParser<DerivedOne>
{
     public List<string> ParseErrorMessage(string defaultMessage, DerivedOne rerived)
     {
        ...
     }
}

【讨论】:

    【解决方案2】:

    这是因为当你实现一个接口时你必须完全匹配其中定义的所有接口成员(方法和属性)。

    在你的情况下你需要写

     public class FirstParser: IErrorParser
     {
          public List<string> ParseErrorMessage(string defaultMessage, BaseClass service);
          {
             ...
          }
     }
    

    接口仅包含方法、属性、事件或索引器的签名。实现接口的类或结构必须实现接口定义中指定的接口成员。

    更多信息:https://msdn.microsoft.com/en-us/library/87d83y5b.aspx

    【讨论】:

    • 我回答后问题变了。目前@Yacoub Massad 的答案最适合您的需求。
    【解决方案3】:

    你可以像这样创建界面

    public interface IErrorParser<T> where T : BaseClass
    {
        List<string> ParseErrorMessage(string defaultMessage, T service);
    }
    

    【讨论】:

      【解决方案4】:

      如果你定义了

      public interface IErrorParser
      {
          List<string> ParseErrorMessage(BaseClass base);
      }
      

      你可以像这样使用 DerivedClass 在一个类中实现它

      public class FirstParser: IErrorParser
      {
           public List<string> ParseErrorMessage(BaseClass baseObj)
           {
              DerivedClass derived = (baseObj as DerivedClass);
              if (derived == null)
              {
                 // handle null value
              }
              ...
           }
      }
      

      编辑 base 是关键字,不应将其用作参数的名称。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-01-20
        • 2014-11-26
        • 2018-08-18
        • 2013-05-22
        • 2021-10-01
        • 2011-05-14
        • 1970-01-01
        相关资源
        最近更新 更多