2010-09-02 37 views
4

this后我谈到了使用通用的基类,使我能够创建存储库类而无需重复加载基本管道代码的负载。C#:方法的通用实现不满足接口

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

接口:

IQueryable<Suggestion> All { get; } 

通用基类

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

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

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

我预料到我可以简单地将该方法从具体类中剥离出来,而编译器将使用泛型基类实现来解决问题,并计划用于满足接口。但不是!

当我把这个方法去掉时,我得到了'没有实现接口成员'的错误。

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

+0

添加类的声明,请。 – 2010-09-02 12:38:56

+0

你具体的类定义是什么样的? T从哪里来? – 2010-09-02 12:40:25

+0

具体课程的声明如何看?你应该包括这个,因为这可能是问题所在。如果它是混凝土:基地,IYourInterface,那么它应该工作。 – 2010-09-02 12:41:48

回答

6

你可以使接口本身是通用的,然后在你的具体类中实现一个类型化的版本?

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 
{ } 
+0

虽然这可能会工作,但我希望为每个存储库类分别配置接口,以便为每个存储库配置依赖注入 – David 2010-09-02 12:40:22

+2

由于它们具有不同的通用类型,因此它们是单独的接口。 <访问说明符><覆盖/虚拟/摘要>允许您将这些注入不同的项目 – 2010-09-02 12:42:18

+0

噢好吧,感谢您的领导 – David 2010-09-02 12:54:04

0

使用虚拟关键字,把你的界面上的具体实现..

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> 
{ 

} 
+1

通常最好的做法是编写'public virtual'。 ...>) – GenericTypeTea 2010-09-02 12:49:15

+0

同意。对不起。正试图快速组合一些东西。 – Nix 2010-09-02 12:54:18