C#多接口继承

时间:2014-03-11 23:33:01

标签: c# oop inheritance multiple-inheritance

给出以下代码:

interface IParent
{
    void ParentPrintMethod();
}

interface IChild : IParent
{ 
    void ChildPrintMethod();
}

class Baby : IChild
{
    public void ParentPrintMethod()
    {
       Console.WriteLine("Parent Print Method");
    }

    public void ChildPrintMethod()
    {
       Console.WriteLine("Child Print Method");
    }

}

此时一切都很顺利。如果您要按如下方式创建Baby类的新实例,

Baby x = new Baby();

一切正常,您可以访问ParentPrintMethod()和ChildPrintMethod();

但是,有人可以向我解释如果你要做以下事情将会发生什么?

IParent x = new Baby();

在这种情况下,您是否可以访问ChildPrintMethod()?你这样做到底发生了什么?

5 个答案:

答案 0 :(得分:3)

然后,您只是指定您对Interface声明的Parent感兴趣,因此您只能访问Parent中声明的那些方法,即使对象本身的实例有更多可用。

答案 1 :(得分:3)

不,你不会。变量x,作为类型Parent(通过by,接口以开头的I惯用命名)只会看到Parent接口中定义的方法。周期。

答案 2 :(得分:2)

您对该对象的引用将类似于Parent接口的实例,并且无法访问Child方法。

答案 3 :(得分:2)

这听起来很不正常但是:所有Child ren都是Parent s,但并非所有Parent都是Child ren。

Parent访问Child方法没有意义,因为在父级不是孩子的情况下会出错。

在您给出的示例中仍然可以访问子方法,但您必须先x Child ((Child)x).ChildPrintMethod()if (x is Child)。这是合理的,因为如果x不是有效的Child,则在转换发生时抛出异常,而不是尝试运行该方法。

您可以提前测试这是否可行,而不是必须使用if (x is Child) { Child y = (Child)x; ... }

捕获异常

编辑:

要重复使用该变量,就像它是一个子项一样,您可以像这样创建一个对它的本地引用:

{{1}}

答案 4 :(得分:1)

没有“继承跳过”这样的事情。您的对象只是通过其中一个接口查看,有效地隐藏了未在该接口中声明的任何其他内容。它没有任何魔力。