【问题标题】:C#: Generic implementation of method doesn't satisfy interfaceC#:方法的通用实现不满足接口
【发布时间】:2011-04-07 07:50:48
【问题描述】:

在this 帖子中,我谈到了使用通用基类使我能够创建存储库类而无需重复加载基本管道代码。

每个存储库都通过一个接口访问。在下面的代码中,为简洁起见,我将只展示其中一种方法:

界面:

IQueryable<Suggestion> All { get; }

通用基类

public IQueryable<T> All
    {
      get { return _unitOfWork.GetList<T>(); }
    }

具体类(实现接口并扩展通用基类)

public IQueryable<Suggestion> All
    {
      get { return _unitOfWork.GetList<Suggestion>(); }
    }

我预计我将能够简单地将方法从具体类中剥离出来,编译器将使用通用基类实现来代替并计算出旨在满足接口的方法。但是没有!

当我剥离方法时,我得到旧的“不实现接口成员”错误。

如果我不能做到这一点,我使用泛型基类的努力不是没有意义吗?或者有没有办法解决这个问题?

【问题讨论】:

  • 请添加类声明。
  • 您的具体类定义是什么样的? T 是从哪里来的?
  • 具体类的声明看起来如何?您应该包括在内,因为这可能是问题所在。如果它是 Concrete:Base、IYourInterface,那么它应该可以工作。
  • AAArrrgh!这完全是我的错。我没有指定具体类扩展基类。当您在新领域工作时,您可能会错过愚蠢的错误。我会删除这个帖子...
  • 现在无法删除。我的愚蠢被永久公开展示。 :(

标签: c# generics inheritance repository-pattern


【解决方案1】:

您能否将接口本身设为通用,然后在您的具体类中实现类型化版本?

public interface IRepository<T>
{
    List<T> All { get; }
}

public class Repository<T>
{
      public List<T> All 
      {
          get { return new List<T>(); }
      }
}

public class SuggestionRepository : Repository<Suggestion>, IRepository<Suggestion>
{ }

我仍然建议使用通用接口,因为它可以避免你重复自己,但这也有效。

public interface ISuggestionRepository
{
    List<Suggestion> All { get; }
}

public class Repository<T>
{
      public List<T> All 
      {
          get { return new List<T>(); }
      }
}

public class SuggestionRepository : Repository<Suggestion>, ISuggestionRepository
{ }

【讨论】:

  • 虽然这可能可行,但我想为每个存储库类设置单独的接口,以便为每个存储库类配置依赖注入。
  • 它们是独立的接口,因为它们具有不同的泛型类型。我使用的所有 DI 框架都允许您将它们作为不同的项目注入。
【解决方案2】:

使用 virtual 关键字并将你的接口放在你的具体实现上..

public interface IMyInterface<T>
{
    IQueryable<T> All { get; }
}

public abstract class MyBaseClass<T> : IMyInterface<T>
{
    public virtual IQueryable<T> All
    {
        get { return _unitOfWork.GetList<T>(); ; }
    }
}

public class MyClass : MyBaseClass<Suggestion>, IMyInterface<Suggestion>
{

}

【讨论】:

  • 写public virtual 通常是最佳实践。最常用的约定是: ()
  • 同意。对不起。正在尝试快速拼凑一些东西。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-11-08
  • 2010-11-23
  • 2021-09-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多