我正在关注一本书,即“.NET Domain Driven Design with C#”。
问题基于如下类图中所示的场景:
图: http ://screencast.com/t/a9UULJVW0
在这张图中,
A)IRepository 接口由(抽象基类)RepositoryBase 实现,而,
B) IRepository 接口也由接口 ICompanyRepository (ICompanyRepository : IRepository) 扩展。
C) ICompanyRepository 由派生自 SQLRepositoryBase 的 CompanyRepository 实现,该 SQLRepositoryBase 派生自 RepositoryBase (; 如 A 点所述,它实现 IRepository,如果 ICompanyRepository 是父级)。
D)我创建了一个接口 ICompanyRepository 的变量,该变量引用了类 CompanyRepository 的对象,如下所示:
ICompanyRepository comRep = new Company Repository();
现在,如果我用 ICompanyRepository 变量 comRep 调用 Add() 函数...
comRep.Add();
然后调用 RepositoryBase 类(CompanyRepository 的父级)中的 Add() 函数。
我的问题: 由于调用(abstract-base)类“RepositoryBase”中的函数 Add() 而发生的确切的底层面向对象规则/机制是什么?为方便起见,我在下面说明两种可能的机制:(请告诉我以下两种机制中的哪一种是正确的基础机制)
Mechanism-1 基类“RepositoryBase”中的这个 Add() 函数是否因为“RepositoryBase”实现了 IRepository 而被调用?(因此,RepositoryBase 类必须实现 IRepository 才能调用 Add() )
或者
机制2: 调用基类“RepositoryBase”中的 Add() 函数是因为 CompanyRepository 实现了 ICompanyRepository,它实现了 IRepository,其中包含 Add() 函数的定义,这样当在 ICompanyRepository 上调用 Add() 函数时(带有变量),它首先找到定义在 ICompanyRepository 中添加,然后在父接口 IRepository 中添加,然后跳转到 CompanyRepository 类以查找 Add() 函数的实现,但没有找到 Add() 函数的定义,它向上遍历父类 SQLRepositoryBase 以查找 Add() 函数等,并且当它在 RepositoryBase 类中找到函数 Add() 时,它会调用 RepositoryBase 中的 Add() 函数。这意味着如果它在 RepositoryBase 的任何派生类中找到 Add() 函数,它没有进一步向上遍历(在父类中)。所有这一切也意味着,为了在类链中从派生类遍历到父类只是为了找到 Add() 函数,RepositoryBase 类真的不需要直接从 IRepository 继承吗?
我的问题中还有其他内容,我无法理解在我的案例中应用了哪个 OO-Rule,如下所述:
在我的问题中有两个接口,一个是父接口,即 IRepository,另一个是扩展它,即 ICompanyRepository。父接口 IRepository 包含 Add() 函数的定义,但不包含子接口 ICopmanyRepository。
类层次结构“CompanyRepository”链中的最后一个派生类实现了 ICompanyRepository(CompanyRepository 不实现 IRepository 接口的 Add() 函数),而根(最顶层的父)(抽象基)类即 RepositoryBase 实现了 Add() 函数。
所以结构就像http://screencast.com/t/a9UULJVW0中显示的图像。
现在,如果我调用 Add() 函数:
code
ICompanyRepository lastDerived = new CompanyRepository(); ICompanyRepository->Add();code
然后根据您在回答中陈述的 OO 规则,查找将从 CompanyRepository 类开始,期望 CompanyRepository 将 Add() 函数实现为
code
IRepository.Add() { } //从 [链接] 中的 P17 和 P18 推导出http://www.codeproject.com/Articles/18743/Interfaces-in-C-For-Beginners[链接]code
但是,在我的例子中,CompanyRepository 类没有实现 IRepository.Add() { } 尽管控制流(在跟踪时)成功地跳转到基类中的 Add() 函数(并且代码工作正常)。我无法理解这里应用的是哪个 OO 规则?
如果您需要我用代码展示上述场景,请告诉我。