【问题标题】:using Inheritance with generics将继承与泛型一起使用
【发布时间】:2013-04-14 15:46:17
【问题描述】:

假设我有一个基类

class Document
{
//some properties
}

和 两个派生类:

public class Order:Document
    {
    //some properties   
    }
public class Request:Document
{
    //some properties   
}

现在我想制作一个具有服务层的分层应用程序。我也想要一个基础服务层接口,例如:

public interface IBaseService<T> where T:Document
{
    IList<T> GetAll();
}

我的层服务类实现它:

public SaleService:IBaseService<Document>;

所以我必须定义IList&lt;Document&gt; GetAll() 来实现基本服务,但我希望我的SaleService 有IList&lt;Order&gt; GetAll() 和IList&lt;Request&gt; GetAll() 方法,而不是IList&lt;Document&gt; GetAll()。 我该怎么做?

【问题讨论】:

  • 你不能,因为你在IBaseService&lt;T&gt;接口中设置了一个IList&lt;T&gt;方法。
  • 听起来你必须在同一个类上有两个不同的GetAll() 方法,具有不同的返回类型。你不能在 C# 中做到这一点。请尝试澄清您的问题。
  • 是的,我在同一个类上有两个不同的 GetAll() 方法,具有不同的返回类型。
  • 你应该简单地使用public SaleService:IBaseService&lt;Order&gt; ...;,否则&lt;T&gt;参数是多余的。

标签: c# generics inheritance interface


【解决方案1】:

您需要使用不同的泛型参数显式实现IBaseService&lt;T&gt;:

public class SalesService : IBaseService<Order>, IBaseService<Request>
{
    IList<Order> IBaseService<Order>.GetAll()
    {
        //return orders
    }

    IList<Request> IBaseService<Request>.GetAll()
    {
        //return requests
    }
}

实现的方法仅通过接口可见,因此您必须强制转换才能调用它们,例如

IBaseService<Request> service = new SalesService();
IList<Request> request = service.GetAll();

您的客户端代码应该只依赖于IBaseService&lt;T&gt; 接口,因此您不需要经常这样做。

【讨论】:

  • 但是通过显式实现IBaseService&lt;Order&gt; 和IBaseService&lt;Request&gt;,GetAll 方法的修饰符是私有的,我不能在我的客户端代码上使用它们。如果将 GetAlls 的修饰符更改为 public,我会收到此错误:“修饰符 'public' 对此项目无效”
  • @Masoud - 是的,它们仅在界面中可见,因此您需要投射 - 请参阅更新。如果您想直接在SalesService 类上调用GetAll,可以隐式实现IBaseService&lt;T&gt; 接口之一。
  • 谢谢,我测试过,它有效。它也与IBaseService&lt;Request&gt; service = new SalesService(); 一起使用,但另一个问题是,我如何在最后一行代码中声明IList&lt;Document&gt; 而不是IList&lt;Request&gt;?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多