假设我有一个简单的抽象基类
abstract class Item : IDisplayable
{
public int Id { get; set; }
public string Name { get; set; }
public abstract void Print();
}
Run Code Online (Sandbox Code Playgroud)
我有一个继承自那样的类
class Chair: Item
{
public int NumberOfLegs {get;set;}
public void Print()
{
Console.WriteLine("Here is a simple interface implementation");
}
}
interface IDisplayable
{
void Print();
}
Run Code Online (Sandbox Code Playgroud)
子类没有明确地说它也实现了接口,但它将通过简单的继承来实现.如果我们将接口显式添加到子类,程序将运行相同的程序(至少在我的简单示例中可以告诉我).明确地实现界面是一个好的或坏的想法,还是严格来说是一个偏好的问题?
我正在读一本书"用.NET编写的.NET域驱动设计".
问题基于以下类图所示的场景:
图:http: //screencast.com/t/a9UULJVW0
在此图中,
A)IRepository接口由(抽象基类)RepositoryBase实现,而
B)IRepository接口也由接口ICompanyRepository(ICompanyRepository : IRepository)扩展.
C)ICompanyRepository由CompanyRepository实现,它派生自SQLRepositoryBase,它源自RepositoryBase(;如A点所述),实现IRepository,如果是ICompanyRepository则为父级.
D)我创建了一个接口ICompanyRepository的变量,它引用了clas CompanyRepository的对象,如下所示:
ICompanyRepository comRep = new Company Repository();
Run Code Online (Sandbox Code Playgroud)
现在,如果我用ICompanyRepository变量comRep调用Add()函数...
comRep.Add();
Run Code Online (Sandbox Code Playgroud)
然后调用RepositoryBase类(它是CompanyRepository的父级)中的Add()函数.
我的问题: 由于调用(抽象 - 基础)类"RepositoryBase"中的函数Add()被调用,确切的基于面向对象的规则/机制是什么?为方便起见,我在下面陈述两种可能的机制:(请告诉我下面两个中哪一个是正确的潜在机制)
机制-1 是否调用了基类"RepositoryBase"中的Add()函数,因为"RepositoryBase"实现了IRepoitory?(因此强制RepositoryBase类实现IRepository以调用Add())
要么
机制-2: 调用基类"RepositoryBase"中的Add()函数是因为CompanyRepository实现了ICompanyRepository,它实现了包含Add()函数定义的IRepository,这样当调用Add()函数(带有变量)ICompanyRepository时,它首先找到定义在ICompanyRepository中添加然后在父接口IRepository中然后跳转到CompanyRepository类以查找Add()函数的实现而没有找到Add()函数的定义它向上遍历到父类SQLRepositoryBase以查找Add()函数等等,并且它在RepositoryBase类中找到函数Add(),因此它调用RepositoryBase中的Add()函数.这意味着如果它在RepositoryBase的任何派生类中找到了Add()函数,它没有进一步向上(在父类中).所有这些也意味着,为了从派生类遍历类链中的父类只是为了找到Add()函数,RepositoryBase类真的不需要直接从IRepository继承吗?
在我的问题中还有其他的事情,我无法理解在我的案例中适用的OO规则如下所述:
在我的问题中有两个接口,一个是父级,即IRepository,另一个是扩展它,即ICompanyRepository.父接口IRepository包含Add()函数的定义,但不包含子接口ICopmanyRepository.
类Hierarchy"CompanyRepository"链中的最后派生类实现ICompanyRepository(CompanyRepository不实现IRepository接口的Add()函数)而root(最顶层父)(抽象基础)类即RepositoryBase实现Add()函数.
所以结构就像http://screencast.com/t/a9UULJVW0中显示的图像.
现在,如果我调用Add()函数:
codeICompanyRepository lastDerived = new CompanyRepository(); ICompanyRepository->添加();code
然后根据您在回答中所述的OO规则,查找将从CompanyRepository类开始,期望CompanyRepository将已实现Add()函数作为
codeIRepository.Add(){} //从[link]中的P17和P18推导出来http://www.codeproject.com/Articles/18743/Interfaces-in-C-For-Beginners[link]code
但是,在我的案例类中,CompanyRepository没有实现IRepository.Add(){},尽管控制流(在跟踪时)成功跳转到基类中的Add()函数(并且代码工作正常).我无法理解哪个OO规则适用于此处?
如果您需要我使用代码显示上述方案,请告诉我.