具有覆盖和阴影的继承链

时间:2017-08-04 16:49:05

标签: c# inheritance method-overriding shadowing

所以在过去的两天里,我一直在接受几次开发职位的采访,其中两家公司提出了非常相似的问题。在大多数情况下,我认为我明白了为什么以及为什么会这样,有些事情我不知道为什么他们按照他们的工作方式工作,最后除了我想要的解释,如果有人可以指导我由于我想更深入地阅读有关此主题的内容,C#的部分负责此行为。

首先,来自访谈的问题:

class Program
{


    static void Main(string[] args)
    {
        A a = new B();
        Console.WriteLine("A a = new B() => a.PrintName Result");
        a.PrintName(); //Output "BBB" as expected
        Console.WriteLine("----------------");
        A c = new C();
        Console.WriteLine("A c = new C() => c.PrintName Result");
        c.PrintName(); //Otuput is again "BBB". What about shadowing?
    }

}

public class A
{
    public virtual void PrintName()
    {
        Console.WriteLine("AAA");
    }
}

public class B : A
{
    public override void PrintName()
    {
        Console.WriteLine("BBB");
    }
}

public class C : B
{
    public new void PrintName()
    {
        Console.WriteLine("CCC");
    }
}

问题与Main方法中的代码有关,您可以看到变量a使用类型A声明但随后使用new B()进行实例化,类似事情正在A c = new C();发生,但您可以在class C中看到而不是覆盖PrintName方法,而是使用new关键字来声明它(来自我的)当用该类型实例化变量时,仍然应该在class C中提供实现,但是正如您在方法调用后的注释中看到的那样,两种情况的结果都是BBB。   所以我的第一个问题是这种行为背后的逻辑。而且作为一个侧面问题,因为在采访期间我不确定正确的答案我试图应用一些相当简单的逻辑,并声明根据(如果我没有记错)MSDN建议最好使用var关键字而不是具体类型,实际上如果我们没有明确指定变量的类型,如下所示:

 var c = new C();
 Console.WriteLine("A c = new C() => c.PrintName Result");
 c.PrintName(); //Otuput is "CCC"
确定我们得到CCC。第二个问题更多地引起了好奇心,因为显然使用var和具体类型并不总是可以互换的,因为我们可以看到基于此可以获得完全不同的结果。   我并没有将此作为某种借口或类似的东西。如果你编写代码,它可能会知道你的代码在做什么,所以也许这个建议隐含地假设开发人员知道这些并且可以做出相应的选择,或者毕竟这是一个诀窍。在候选人知道他的东西,并在一天结束时使用var总是更好,这种编码不鼓励(我希望它是这样)或有有效的情况,我们想要从这个确切的利用我描述的行为?

0 个答案:

没有答案