是否存在从抽象类和接口继承的问题,抽象继承自基接口

时间:2013-09-05 17:08:11

标签: c# oop unit-testing inheritance abstract-class

是否有任何问题继承自抽象继承自基接口的抽象类和接口。以下示例仅用于显示概念。我这样做是为了创建一个基于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();
}

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

由于

2 个答案:

答案 0 :(得分:0)

你不需要在具体类中实现接口,如果你的基类实现了一些接口,那么它的所有'子接口将自动成为这个接口的实现者

答案 1 :(得分: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继承的接口可能是您最好的选择。