Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/12.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语言中的接口继承#_C#_Oop_Interface_Covariance - Fatal编程技术网

C# C语言中的接口继承#

C# C语言中的接口继承#,c#,oop,interface,covariance,C#,Oop,Interface,Covariance,我正试图克服在编写应用程序时遇到的(对我来说)相当大的问题。 请看这个(为了简单起见,我会尽量缩短代码): 我有一个名为IRepository的根接口。 接下来,IBookRepository:IRepository 接下来是实现它的具体类:BookRepository:IBookRepository 在RepositoryManager类中,我声明了私有IRepository currentRepo IRepoItem是一个由Book类实现的接口 现在,当我尝试这样做时: currentRep

我正试图克服在编写应用程序时遇到的(对我来说)相当大的问题。 请看这个(为了简单起见,我会尽量缩短代码):

我有一个名为
IRepository
的根接口。 接下来,
IBookRepository:IRepository
接下来是实现它的具体类:
BookRepository:IBookRepository

在RepositoryManager类中,我声明了私有IRepository currentRepo

IRepoItem
是一个由Book类实现的接口

现在,当我尝试这样做时:

currentRepo = new BookRepository();
VisualStudio给出错误消息:

无法将类型“BookRepository”隐式转换为“IRepository”。存在显式转换(是否缺少转换?

我试图显式强制转换,但引发了运行时异常

我知道(几乎可以肯定)这是一种叫做协方差的东西,这(可能)在.NET4.0中得到了解决。 不幸的是,我使用的是框架3.5版,我无法改变这一点。请给我一些建议怎么做-如何超越这个问题?我想从RepoFactory获得currentRepo,它可以根据用户需要生成几种存储库。我不知道这里是否允许链接,但我写了一些博客来描述应用程序的创建。我的英语不好,但我希望它足以理解我。提前感谢您的回答

致以最良好的祝愿,
在.NET3.5中,skrzeczowas

您绝对不能将
IRepository
视为
IRepository


我们需要更多地了解您在
RepositoryManager
中使用存储库的目的,才能真正了解如何解决它。。。但是,您能否创建一个非通用的
IRepository
接口来扩展
IRepository
?让它包含所有不引用t的成员。然后您可以将
currentRepo
声明为.NET3.5中的
IRepository
在.NET4中IRepository和IRepository之间没有任何关系,您可以通过协方差和逆变支持实现类似的功能(但这取决于IRepository接口声明)


A建议您使用非通用的IRepository界面,并自己进行转换。我知道,这并不美妙,但您描述的偏好需要协变/逆变支持。

尝试使用中间层(IRep):

接口假定
{
}
接口IRep:IRepository,其中T:IRepoItem
{
}
接口IBookRepository:IRep
{
}
类BookRepository:IBookRepository
{
}
然后你可以做你想做的事:

        BookRepository br = new BookRepository();
        IRepository<IRepoItem> currentRepo = br;
BookRepository br=newbookrepository();
i假定当前回购=br;

currentRepo的声明类型是什么?没关系,我看到它是一个IRepository。+1-我考虑过这个非通用的
IRepository
接口,但不确定如何实现它。非常好的Jon!=)你好!我以这里描述的方式拥有存储库:我创建了DbManager来管理数据库,并为每个表(书籍、漫画、邮票等)创建存储库。现在我希望DbManager中的currentRepository可以是BookRepository、StampsRepository,无论什么-我认为这个带有接口的东西可以,但不幸的是不是,因为IRepoItem(正如我今天意识到的)应该有所有不同的属性,然后…:(谢谢你的回答,我使用了下面这个答案,并意识到这并不完全适合我:(我不知道现在该怎么办……IRepoItem不能拥有书籍、漫画、邮票所包含的所有属性:(嗨!这很棒,非常优雅,我很高兴你发布了这篇文章。不幸的是,正如我在上面的评论中所描述的,我意识到这并不完全适合我。IRepoItem是一个可以在书籍、邮票、漫画中实现的界面,所以它应该具有不同物品的所有属性。这不明智,我必须要找到另一种方法来实现我想要的-这意味着我希望currentRepo成为BookRepository或StampsRepository或任何其他存储库…请提供一些帮助?iRepositem作为其他东西的接口只会导致整合它们的共同点,而不是“所有属性”。例如,IMoveable应该只公开Move方法,而不是所有派生类(如Cheetah、Car、Planet)的所有内容。但是,如果我使用currentRepo=StampsRepo();,我将只能使用IRepository包含的方法。我将无法使用IStampsRepository方法:(我相信我可以问这个currentRepo是什么类型的:如果(currentRepo是IBookRepository)做点别的,如果(currentRepo是IStampsRepository)做点什么……但我认为这不是一个好的对象编程。我必须重新考虑我所做的所有假设,因为也许我想要的是愚蠢的、无法实现的……如果是这样的话,祝重构好运;)
        BookRepository br = new BookRepository();
        IRepository<IRepoItem> currentRepo = br;