我正在学习一本名为".NET Domain Driven Design with C#"的书。
问题基于以下类图场景:
图示: http://screencast.com/t/a9UULJVW0
在这个图示中,
A) IRepository接口由(抽象基类)RepositoryBase实现,而
B) IRepository接口也被ICompanyRepository接口扩展(ICompanyRepository : IRepository)。
C) ICompanyRepository由CompanyRepository实现,后者派生自SQLRepositoryBase,后者又派生自RepositoryBase (如A点所述),其实现了IRepository,是ICompanyRepository的父接口。
D) 我创建了一个接口变量ICompanyRepository,并引用了类CompanyRepository的对象,如下所示:
ICompanyRepository comRep = new Company Repository();
现在,如果我使用 ICompanyRepository 变量 comRep 调用 Add() 函数...
comRep.Add();
然后调用RepositoryBase类中的Add()函数(它是CompanyRepository的父类)。我的问题是:由于哪个确切的面向对象规则/机制导致在(抽象基类)“RepositoryBase”类中调用Add()函数?为方便起见,我以下列出了两种可能的机制:(请告诉我下面列出的两种机制中哪一种是正确的基础机制)
机制1:因为“RepositoryBase”实现了IRepoitory,所以调用基类“RepositoryBase”中的Add()函数?(因此要求RepositoryBase类实现IRepository才能调用Add())
或者
机制2:在基类“RepositoryBase”中调用Add()函数,因为CompanyRepository实现了ICompanyRepository,ICompanyRepository又实现了IRepository,而IRepository包含Add()函数的定义。因此,当在ICompanyRepository上调用Add()函数时,首先在ICompanyRepository中查找Add的定义,然后在父接口IRepository中查找,然后跳转到CompanyRepository类中查找Add()函数的实现,如果没有找到Add()函数的定义,则向上遍历到父类SQLRepositoryBase中查找Add()函数,最终在RepositoryBase类中找到Add()函数并调用它。这意味着,如果在RepositoryBase的任何派生类中找到Add()函数,则不会向上遍历(在父类中)。所有这些也意味着,在类链中从派生类向父类遍历以查找Add()函数时,RepositoryBase类实际上不需要直接继承IRepository?
在我的问题中有其他的事情,我无法理解哪个面向对象规则适用于我的情况,如下所述:
在我的问题中有两个接口,一个是父类即IRepository,另一个是扩展它即ICompanyRepository。父接口IRepository包含Add()函数的定义,但子接口ICopmanyRepository没有。
类层次结构链中的最后一个派生类“CompanyRepository”实现了ICompanyRepository(CompanyRepository没有实现IRepository接口的Add()函数),而根(最顶层)(抽象基类)类RepositoryBase实现了Add()函数。
因此,结构像http://screencast.com/t/a9UULJVW0中显示的图像一样。
现在如果我调用Add()函数:
ICompanyRepository lastDerived = new CompanyRepository(); ICompanyRepository->Add();
根据你在答案中提到的OO规则,查找将从CompanyRepository类开始,期望CompanyRepository已经实现了Add()函数,如下所示:
code
IRepository.Add() {
} //根据[link] http://www.codeproject.com/Articles/18743/Interfaces-in-C-For-Beginners[link]第17页和第18页推导而来。code
然而,在我的情况下,CompanyRepository类没有实现IRepository.Add(){},尽管控制流(在跟踪时)可以成功跳转到基类中的Add()函数(并且代码工作正常)。我无法理解这里应用了哪个OO规则?如果需要,让我知道是否需要展示上述带有代码的场景。