给出以下代码:
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()?你这样做到底发生了什么?
答案 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)
没有“继承跳过”这样的事情。您的对象只是通过其中一个接口查看,有效地隐藏了未在该接口中声明的任何其他内容。它没有任何魔力。