【问题标题】:Implementing multiple interface using generics使用泛型实现多个接口
【发布时间】:2016-03-08 19:13:11
【问题描述】:

我想使用泛型实现接口中的方法。但我收到错误。 例如 //Filter在这里是一个类。

public interface IComponent<T>
{
  List<T> GetOrderSummary(Filter input);
  T GetOrderDetails(string orderId);
  List<T> GetOrderSummaryDetails(Filter input);
}

// ORDER A AND ORDER B ARE TWO MODEL CLASSES HERE
public class OrderDetails : IComponent<OrderA>,IComponent<OrderB>
{
  public List<OrderA> GetOrderSummary(Filter input)
  {
    //Some logic
    //lst of type OrderA
    return lst;
  }

  public List<OrderB> GetOrderSummaryDetails(Filter input)
  {
    //Some logic
    //lst of type OrderB
    return lst
  }

  public OrderA GetOrderDetails(string orderId)
  {
    throw new NotImplementedException();
  }
}

我在构建时遇到错误

OrderDetails 没有实现接口成员 IComponent.GetOrderSummaryDetails(Filter).OrderDetails.GetOrderSummaryDetails 无法实现 IComponent.GetOrderSummaryDetails(Filter) 因为它没有匹配的返回类型List&lt;OrderA&gt;

OrderDetails 没有实现接口成员 IComponent.GetOrderSummary(Filter).OrderDetails.GetOrderSummary 无法实现 IComponent.GetOrderSummary(Filter) 因为它没有匹配的返回类型List&lt;OrderB&gt;

OrderDetails 没有实现接口成员 IComponent.GetOrderDetails(string).OrderDetails.GetOrderDetails(string) 无法实现 IComponent.GetOrderDetails(string) 因为它没有匹配的返回类型 OrderB

请告诉我如何解决这些问题。

【问题讨论】:

  • 您是否尝试过使用显式接口实现? afaik 方法的区别仅在于它们的名称和输入参数,而不是它们的返回值。
  • OrderDetails 类是否只包含 3 个方法?请注意,您不能隐式实现这两个接口,因为这样您将拥有两个具有相同参数但返回值类型不同的方法,这在 c# 中是非法的。你可以明确地实现它们。

标签: c# generics interface


【解决方案1】:

您需要显式实现这两个接口,如下所示:

public class OrderDetails : IComponent<OrderA>, IComponent<OrderB>
{
    List<OrderA> IComponent<OrderA>.GetOrderSummary(Filter input)
    {
        throw new NotImplementedException();
    }

    OrderB IComponent<OrderB>.GetOrderDetails(string orderId)
    {
        throw new NotImplementedException();
    }

    List<OrderB> IComponent<OrderB>.GetOrderSummaryDetails(Filter input)
    {
        throw new NotImplementedException();
    }

    List<OrderB> IComponent<OrderB>.GetOrderSummary(Filter input)
    {
        throw new NotImplementedException();
    }

    OrderA IComponent<OrderA>.GetOrderDetails(string orderId)
    {
        throw new NotImplementedException();
    }

    List<OrderA> IComponent<OrderA>.GetOrderSummaryDetails(Filter input)
    {
        throw new NotImplementedException();
    }
}

稍后,要访问正确的方法,您可以使用强制转换或正确的变量类型:

var orderDetails1 = new OrderDetails();
var details1 = ((IComponent<OrderA>)orderDetails1).GetOrderDetails("");

IComponent<OrderA> orderDetails2 = new OrderDetails();
var details2 = orderDetails2.GetOrderDetails("");

【讨论】:

    猜你喜欢
    • 2021-09-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多