新的关键字混乱

时间:2012-08-10 15:16:33

标签: c# .net

全部 -

已阅读有关新关键字的各种文章及何时使用:

MSDN - http://msdn.microsoft.com/en-us/library/6fawty39(v=vs.80).aspx

StackOverflow - benefit of using new keyword in derived class member having same name with base class member

以下是我为实践此概念而编写的示例代码

    static void Main(string[] args)
    {
        Animal a2 = new Dog();
        a2.Talk();
        a2.Sing();
        a2.Greet();
        a2.Dance();
        Console.ReadLine();
    }

class Animal
{
    public Animal()
    {
        Console.WriteLine("Animal constructor");
    }

    public void Talk()
    {
        Console.WriteLine("Animal is Talking");
    }

    public virtual void Sing()
    {
        Console.WriteLine("Animal is Singing");
    }

    public void Greet()
    {
        Console.WriteLine("Animal is Greeting");
    }

    public virtual void Dance()
    {
        Console.WriteLine("Animal is Dancing");
    }
}

//Derived Class Dog from Animal
class Dog : Animal
{
    public Dog()
    {
        Console.WriteLine("Dog Constructor");
    }

    public new void Talk()
    {
        Console.WriteLine("Dog is Talking");
    }

    public override void Sing()
    {
        //base.Sing();
        Console.WriteLine("Dog is Singing");
    }

    public new void Dance()
    {
        Console.WriteLine("Dog is Dancing");
    }
}

我的输出结果如下:

enter image description here

让我感到困惑的是,通过在derieved类中使用new关键字实际上显示了基类的输出。不是错误的 - 不是新的关键字应该隐藏基类成员,所以动物是说话和动物跳舞的结果不应该打印。

由于

2 个答案:

答案 0 :(得分:7)

“new”表示方法是“new”而不是“override”。因此,如果从基数调用该名称的方法,则它尚未被覆盖,因此不会调用派生。

答案 1 :(得分:0)

这对我来说也很困惑,但简单地说:

new关键字隐藏了父级的子级成员。