关于“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 !!!
答案 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");
}
}
现在您将看到您的最终块与以前完全一样,但当BaseRef
为dOb2
时它实际上在基类上调用该方法。这是因为override替换了虚方法调用,而new表示在派生类中有一个不同的方法,并且在基类上调用它的方法就是这样。 http://msdn.microsoft.com/en-us/library/435f1dw2.aspx详细讨论了这一点。
应该注意的是,你很少想使用new
修饰符,所以不要过长时间。