日期:2014-05-20  浏览次数:20785 次

C#多态的问题
[code=C#][/code]

using System;
using System.Collections.Generic;
using System.Text;
using System.Threading;

namespace OOTest
{
  public class Father
  {
  public virtual void TestVoice()
  {
  Console.WriteLine("Father_TestVoice");
  }

  public void Test()
  {
  Console.WriteLine("Father Test");
  }
  }

  public class Son : Father
  {
  public override void TestVoice()
  {
  Console.WriteLine("Son_TestVoice");
  }

  public new void Test()
  {
  Console.WriteLine("Son Test");
  }

  public static void Main()
  {
  Father son = new Son(); //1
  son.TestVoice(); //2

  son.Test();
  Thread.Sleep(30000);
  }
  }  
}

最后的输出结果是:
Son_TestVoice
Father Test

第一个结果我知道原因,但是第二个结果我不知道具体是什么原因,为什么他不是调用的Son类中的Test方法呢?哪位大虾能告诉我,请说明详细一些。万分感谢!!!


------解决方案--------------------
对于用子类实例化的父类,父类用virtual标记的方法会正确调用子类override的方法,但是对于子类中用new标记的方法,则还是会调用父类中的方法,因为对于父类来说,override才对其起作用,new对于父类,相当于子类的新方法。
------解决方案--------------------
探讨
这些涉及到new virtual override ;new只是隐藏父类的方法,override 是覆盖父类的方法,所以son.TestVoice(); 无论如何输出的都是Son_TestVoice ;但是son.Test()调用的是父类的方法,因为你声明的时候是用的Father son ;如果你Son son =new ....那调用的就是子类的方法了,如果Son son =new ....你想使 son.Test(); 调用父类的方法你就必须强类型转化(Father)son 就可以了