1

从抽象类和接口继承抽象从基接口继承的问题是否存在。下面的例子是为了展示这个概念而做了很多删减。我这样做是为了创建一个基于 IFooRepository 的假类,并且 FooRepository 可以重用我的抽象类中的所有代码(将由许多其他类共享):

public interface IMyRepository<T> where T : class
{
    List<T> GetEntity();
}

public abstract class MyRepository<T> : IMyRepository<T> where T : class
{
    protected readonly string _connectionString;

    public virtual T CommonFunction(int Id)
    {
        //do my common code here
    }

    public List<T> GetEntity()
    {
    }

}

public interface IFooRepository : IMyRepository<Foo>
{
    void UpdateFoo(int id, string foo);
}


public class FooRepository : MyRepository<Foo>, IFooRepository
{
    public void UpdateFoo(int id, string foo)
    {
        throw new NotImplementedException();
    }
}

public class FakeFooRepository :  IFooRepository
{
    public List<Foo> GetEntity()
    {
        throw new NotImplementedException();
    }

    public void UpdateFoo(int id, string foo)
    {
        throw new NotImplementedException();
    }
}

public interface IBarRepository : IMyRepository<Bar>
{
    void DoSomethingElse(int id);
}

public class BarRepository : MyRepository<Bar>, IBarRepository
{
    public void DoSomethingElse(int id)
    {

    }
}

如果 IFooRepository 不继承自 IMyRepository 而是包含所有这样的成员,是否会更好:

public interface IFooRepository
{
    void UpdateFoo(int id, string foo);
    List<Foo> GetEntity();
}

无论哪种方式,整个事情都可以按我的预期编译和工作,只是想知道由于接口重叠是否会出现任何问题。

谢谢

4

2 回答 2

0

您的第一个示例看起来非常合理。IFooRepository 继承自 IMyRepository,因为该接口本质上是 Foo 类型的 IMyRepository。出于同样的原因,您的第二个 IFooRepository 不从 IMyRepository 继承的示例肯定会破坏您试图建立的关系。这听起来不是一个好计划。

您通常可能考虑这样做的另一种方法是使 Foo 和 Bar(和 T)都成为一个通用类型(IRepositable 或其他东西),并且特定于 Foo 或 Bar 存储库的行为在它们各自的 IRepositable 实现中表示。如果这可以通过保持对 Foo 和 Bar 的适当封装的方式来完成,那么您最终会得到一个非常优雅的解决方案。

如果 Foo 需要执行 UpdateFoo 并且 Bar 同样需要使用相同的方法签名执行 UpdateBar 等任何其他 IRepositable,这将起作用。但在您的情况下,方法名称 DoSomethingElse 似乎表明 IBarRepository 正在实现一些与 UpdateFoo 方法完全不同的行为。如果这是真的,那么你是对的。从特定类型的 IMyRepository 继承的接口可能是您最好的选择。

于 2013-09-05T21:06:45.793 回答
0

您不需要在具体类中实现接口,如果您的基类实现了某个接口,那么它的所有子类都将自动成为该接口的实现者

于 2013-09-05T17:14:09.457 回答