2016-03-08 98 views
0

我想要在使用泛型的接口中实现这些方法。但我得到错误。 例如 // 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(); 
    } 
} 

我得到错误的建筑,

订单明细没有实现接口成员IComponent.GetOrderSummaryDetails(过滤器).OrderDetails.GetOrderSummaryDetails无法实现IComponent.GetOrderSummaryDetails(过滤器)怎么一回事,因为它不具有匹配的List<OrderA>

订单明细返回类型未实现接口构件IComponent.GetOrderSummary(滤波器).OrderDetails.GetOrderSummary不能怎么一回事,因为它实现IComponent.GetOrderSummary(过滤器)不具有的List<OrderB>

订单明细匹配的返回类型未实现接口构件IComponent.GetOrderDetails(字符串).OrderDetails.GetOrderDetails(字符串)不能实现IComponent.GetOrderDetails(字符串)东阳它不具有匹配返回类型OrderB

请让我知道如何解决这些问题。

+0

您是否尝试过使用显式接口实施? afaik方法仅通过它们的名称和输入参数来区分,而不是它们的返回值。 – Domysee

+1

'OrderDetails'类是否仅包含3个方法?请注意,你不能隐式地实现这两个接口,因为那么你将有两个具有相同参数但返回值类型不同的方法,这在c#中是非法的。你可以明确地实现它们。 –

回答

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("");