使用虚拟关键字&覆盖使用C#

时间:2014-10-08 09:39:22

标签: c#

关于“C#3.0-完整参考”(第295页)的书中说:

  

该程序创建一个名为Base的基类和两个名为Derived1的派生类   andDerived2。 Base声明了一个名为Who()的方法,派生类会覆盖它。   在Main()方法中,声明了Base,Derived1和Derived2类型的对象。也,   声明了一个名为baseRef的Base类型的引用。然后该程序分配一个参考   将每种类型的对象改为baseRef并使用该引用来调用Who()。作为输出   显示,执行的Who()版本由所引用的对象类型决定   在调用时,不是由类型的baseRef

现在重点是,我们是否有必要使用basereference并为其分配每个派生类的对象,以便利用方法覆盖和虚拟关键字,因为我已经测试过它也正常工作,而不是当我没有使用任何基础参考时。

你走了:

class Base
{
    // Create virtual method in the base class.  
    public virtual void Who()
    {
        Console.WriteLine("Who() in Base");
    }
}
class Derived1 : Base
{
    // Override Who() in a derived class. 
    public override void Who()
    {
        Console.WriteLine("Who() in Derived1");
    }
}

class Derived2 : Base
{
    // Override Who() again in another derived class. 
    public override void Who()
    {
        Console.WriteLine("Who() in Derived2");
    }
}

class Program
{
    static void Main(string[] args)
    {
        Base baseOb = new Base();
        Derived1 dOb1 = new Derived1();
        Derived2 dOb2 = new Derived2();

        Base baseRef; // a base-class reference 

        baseRef = baseOb;
        baseRef.Who();

        baseRef = dOb1;
        baseRef.Who();

        baseRef = dOb2;
        baseRef.Who();

        //but this works too the same

          baseOb.Who();
          dob1.Who();
          dob2.Who();



    }
}

}

要足够勇敢地回答它而不是downvote !!!

1 个答案:

答案 0 :(得分:0)

他们试图在这里提出的要点是澄清,如果你做Base baseRef = new Derived1(),那么当你重写虚拟方法时使用的行为就是派生类的行为。如果您不知道它应该如何工作,您可能会认为如果您的引用类型为Base,它将使用该类的方法。这当然是错误的,你知道,但向人们展示它是很好的。

如果您使用new关键字而不是override,则该行为确实存在。尝试将您的课程更改为此并再次运行:

class Derived2 : Base
{
    // Override Who() again in another derived class. 
    public new void Who()
    {
        Console.WriteLine("Who() in Derived2");
    }
}

现在您将看到您的最终块与以前完全一样,但当BaseRefdOb2时它实际上在基类上调用该方法。这是因为override替换了虚方法调用,而new表示在派生类中有一个不同的方法,并且在基类上调用它的方法就是这样。 http://msdn.microsoft.com/en-us/library/435f1dw2.aspx详细讨论了这一点。

应该注意的是,你很少想使用new修饰符,所以不要过长时间。