Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 从抽象类和抽象从基接口继承的接口继承时,是否存在任何问题_C#_Oop_Unit Testing_Inheritance_Abstract Class - Fatal编程技术网

C# 从抽象类和抽象从基接口继承的接口继承时,是否存在任何问题

C# 从抽象类和抽象从基接口继承的接口继承时,是否存在任何问题,c#,oop,unit-testing,inheritance,abstract-class,C#,Oop,Unit Testing,Inheritance,Abstract Class,从抽象类和抽象从基接口继承的接口继承时是否存在任何问题。下面的例子是一个大大减少只是为了显示概念。我这样做是为了基于IFooRepository创建一个假类,并且FooRepository可以重用抽象类中的所有代码(这些代码将由许多其他类共享): 公共接口IMyRepository,其中T:class { 列出GetEntity(); } 公共抽象类MyRepository:IMyRepository其中T:class { 受保护的只读字符串_connectionString; 公共虚拟T公共函

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

公共接口IMyRepository,其中T:class
{
列出GetEntity();
}
公共抽象类MyRepository:IMyRepository其中T:class
{
受保护的只读字符串_connectionString;
公共虚拟T公共函数(int Id)
{
//这里有我的通用代码吗
}
公共列表GetEntity()
{
}
}
公共接口IFooRepository:IMyRepository
{
void UpdateFoo(int-id,字符串foo);
}
公共类FooRepository:MyRepository、IFooRepository
{
public void UpdateFoo(int-id,string-foo)
{
抛出新的NotImplementedException();
}
}
公共类fakefooorepository:IFooRepository
{
公共列表GetEntity()
{
抛出新的NotImplementedException();
}
public void UpdateFoo(int-id,string-foo)
{
抛出新的NotImplementedException();
}
}
公共接口IBarRepository:IMyRepository
{
void DoSomethingElse(内部id);
}
公共类存储库:MyRepository、IBarRepository
{
公共无效DoSomethingElse(内部id)
{
}
}
如果IFooRepository不从IMyRepository继承,而是包含以下所有成员,则更好:

public interface IFooRepository
{
    void UpdateFoo(int id, string foo);
    List<Foo> GetEntity();
}
公共接口IFooRepository
{
void UpdateFoo(int-id,字符串foo);
列出GetEntity();
}
无论哪种方式,整个过程都按照我的预期进行编译和工作,我只是想知道,由于接口重叠,是否会出现任何问题


谢谢

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

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

另一种方法,您通常会考虑这样做是为了使FO和BAR(和T)成为一个公共类型(IsSabvior或某事),并且特定于FoO或Bar存储库的行为在它们独立的IsReavable实现中表示。如果这可以通过保持Foo和Bar的适当封装的方式来完成,那么最终将得到一个非常优雅的解决方案


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

是的,但是FooRepository和FakeFooRepository将有不同的实现。因此,需要在顶层实现“适当”类的任何共享实现都将发生在MyRepository中。在这种情况下,最好的方法就是在基类中定义具有相应实现的虚拟方法,并在需要时重写它们。您的FooRepository是IFooRepository,因为您是从实现该存储库的类派生出来的,所以没有必要这样做。谢谢,但我不太确定这对我来说是否有效,因为这些函数在MyRepository中是通用的,但它们只对某些类通用,而不是FakeFooRepository(即FakeFooRepository)因为它有一个完全独立的实现。因此,IFooRepository有bothAlso的共同点,所以也用BarRepository更新了示例,希望能让它更清晰。谢谢Hanks Mark,我想我会选择第一个例子。我曾担心接口重叠,但在本例中这样做似乎没有问题
public interface IFooRepository
{
    void UpdateFoo(int id, string foo);
    List<Foo> GetEntity();
}