从抽象类和接口继承是否有任何问题,其中抽象继承自基接口

本文关键字:继承 接口 抽象 任何 抽象类 是否 问题 | 更新日期: 2023-09-27 18:30:23

从抽象类和抽象接口继承自基接口的抽象类和接口是否有任何问题。下面的例子只是为了展示这个概念而大幅削减。我这样做是为了创建一个基于 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();
}

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

谢谢

从抽象类和接口继承是否有任何问题,其中抽象继承自基接口

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

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

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

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