代码之家  ›  专栏  ›  技术社区  ›  David

C#:方法的泛型实现不满足接口

  •  4
  • David  · 技术社区  · 14 年前

    在里面 this 在这篇文章中,我谈到了使用一个通用基类来创建存储库类,而无需重复加载基本的管道代码。

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

    接口:

    IQueryable<Suggestion> All { get; }
    

    泛型基类

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

    混凝土等级 (实现接口并扩展通用基类)

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

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

    当我去掉该方法时,我得到了旧的“不实现接口成员”错误。

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

    2 回复  |  直到 7 年前
        1
  •  6
  •   Martin Harris    14 年前

    您能否将接口本身设置为泛型,然后在具体类中实现一个类型化版本?

    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
    { }
    
        2
  •  0
  •   Nix    14 年前

    使用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>
    {
    
    }