问题描述
- C#的一个关于继承很基础但又很让我不解的问题。。。
-
class Program { static void Main(string[] args) { Person p = new Student(); Console.WriteLine(p.GetType()); p.SayHi(); Console.ReadKey(); } class Person { public void SayHi() { Console.WriteLine("我是人类"); } } class Student : Person { public new void SayHi() { Console.WriteLine("我是学生"); } } }
如代码,p 这个对象通过p.getType()可知它的类型是Student类
既然是Student类
那么调用它的SayHi方法就应该调用Student类里的SayHi方法啊
可是实际上却调用了Person类的SayHi方法结果应该所有人都知道,但是为什么呢
真的很不理解为什么,有没有比较懂原理的解释一下~
解决方案
因为你是new,所以两个SayHi()其实毫无关系,只是碰巧名字一样而已。
p.SayHi();调用的不是继承的那个SayHi,如果你要调用,必须类型转换
(p as Student).SayHi();
再多说一点,这个new其实是很少用到的,如果你写了1年代码,从来没用到它,那很正常,不但如此,除非迫不得已,根本也没必要用。
解决方案二:
就你的例子而言Person p = new Student();
其中Person是申明类,Student是实例类;运行到 p.SayHi()时,会先去申明类Person中的SayHi()方法检查是否有Virtual关键字;
如果没有,执行的的就是申明类的SayHi()方法;如果有,回去实例类中检查是否有override关键字,有的话执行的就是实例类中的方法;
如果实例类中没有override关键字,那么就会去实例类的基类中去找,一直找到这个方法的父方法
时间: 2024-11-03 17:02:12