专注收集记录技术开发学习笔记、技术难点、解决方案
网站信息搜索 >> 请输入关键词:
您当前的位置: 首页 > .NET分析设计

C#多态的有关问题

发布时间:2011-06-23 20:38:27 文章来源:www.iduyao.cn 采编人员:星星草
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 就可以了
友情提示:
信息收集于互联网,如果您发现错误或造成侵权,请及时通知本站更正或删除,具体联系方式见页面底部联系我们,谢谢。

其他相似内容:

热门推荐: