当前位置: 首页 > 知识库问答 >
问题:

基类实现基接口,而派生/具体类实现扩展接口,为什么?

段干靖
2023-03-14

我正在学习一本书,即“.NET域驱动的C#设计”。

问题基于如下类图所示的场景:

图:http://screencast.com/t/a9uuljvw0

ICompanyRepository comRep = new Company Repository();

现在,如果我用ICompanyRepository变量comrep调用Add()函数...

comRep.Add(); 

然后调用RepositoryBase类(它是CompanyRepository的父类)中的Add()函数。

我的问题是:在(抽象基)类“repositorybase”中调用函数Add()的确切基础面向对象规则/机制是什么?为了方便起见,我在下面陈述了两种可能的机制:(请告诉我下面两种机制中哪一种是正确的底层机制)

类层次结构链中的最后一个派生类“CompanyRepository”实现ICompanyRepository(CompanyRepository不实现IRepository接口的Add()函数),而root(最上层的父级)(抽象基)类即RepositoryBase实现Add()函数。

因此,该结构类似于http://screencast.com/t/a9uuljvw0中所示的图像。

现在,如果我调用Add()函数:

共有1个答案

呼延衡
2023-03-14

话可真多。我将重述我认为你在问什么,并回答这个问题。如果我说错了,告诉我。

当通过接口调用方法时,如果该接口再次显式声明为在类型层次结构中更派生的类型上实现,这是否重要?

是的,这被称为“接口重新实现”,它改变了方法的映射方式。C#语言规范(第13.4.6节接口重新实现)对此进行了更详细的介绍,但要点是指定接口的最派生类型是查找的起点。

interface ICreature
{
    void Speak();
}

class Animal : ICreature
{
    public void Speak() { Console.WriteLine("Rawr"); }
}

class Duck:Animal
{
    public void Speak() { Console.WriteLine("Quack"); }
}

class Human : Animal, ICreature
{
    public void Speak() { Console.WriteLine("Hello"); }
}
ICreature duck = new Duck();
ICreature human = new Human();
duck.Speak();
human.Speak();
    null
    null
 类似资料:
  • 在这种情况下,输出将是“base”。 如果我明确地声明派生实现了IBase(实际上已经由基类base实现了,这样的注释似乎没有用),那么输出将是“派生的” 这种行为的原因是什么? VS 15.3.5,C#7

  • 问题内容: 为了减少类的依赖性,我想将参数(使用泛型类)发送到扩展某些类并实现接口的构造函数,例如 可能吗? 此外,使用T类,我想使用T.getActivity()作为Context创建视图。 问题答案: T必须扩展Fragment并实现SomeInterface 在这种情况下,您可以声明以下内容: 这将需要扩展和实现类型的对象。 此外,使用T类,我想使用T.getActivity()作为Cont

  • 问题内容: 我有以下类和接口: 我想创建一个方法,其中参数需要为BasicObject类型并实现CodeObject。我尝试了以下代码,但不能保证clazz是实现CodeObject的类。 我想做这样的事情,但不能编译: 问题答案: 您的模式类必须扩展和扩展/实现(实际上是一个接口)。您可以使用方法签名的通配符定义中声明的多个类来执行此操作,如下所示: 请注意,如果您通过以下任何一种方式进行操作,

  • 我有以下类和接口: 我想创建一个方法,其中参数需要是BasicObject类型,并实现CodeObject。我尝试了以下代码,但它不能保证clazz是一个实现CodeObject的类。 我想做这样的事情,但它无法编译:

  • 我有个Z接口。它是由Y类实现的。我有另一个继承类Y的类x。因为y实现了类z指定的契约,所以x做同样的事情,因为它扩展了类y。因此,它是否也应该实现接口Z?