繁体   English   中英

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

[英]Are there any issue inheriting from an abstract class and interface where the abstract inherits from base interface

从抽象类和接口继承的问题是否存在,其中抽象从基本接口继承。 下面的示例仅是为了说明概念而进行了精简。 我这样做是为了创建一个基于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,以此类推,对于其他任何IRepositable来说都是如此。 但是在您的情况下,方法名称DoSomethingElse似乎表明IBarRepository正在实现与UpdateFoo方法完全不同的行为。 如果是这样,那么您是正确的。 从特定类型的IMyRepository继承的接口可能是最好的选择。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM