高分请教简单的小问题,请大家帮帮(C#引用) 1、想弄明白为什么C#中基类引用可以引用派生类的对象?2、new关键字在隐藏基类成员时,依据是什么,为什么可以实现隐藏? 解决就给分,一题20,决不食言。 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 1.这个问题与1+1为什么等于2没什么区别。2.如果签名相同的方法在基类与派生类中都进行了声明,该方法也没有virtual或者override,派生类方法就会隐藏基类方法。为什么可以实现隐藏?我也不知道 1.这叫多态,也是OOP本身的特点。2.new实例化对象的时候执行一个初始化器,初始化器通常也称构造函数,听清楚了,别把这个构造函数当做很神圣的东西,也就是个方法成员,凭什么不让隐藏掉? 1. 多态, CLR在运行时可以把父类的引用指向子类的实例。 在编译期间的类型安全是由编译器确定的。2. new 也是c#的关键词吧。 CLR确保在运行时用你new的这个方法可以覆盖父类的同名方法。 1. 多态, CLR在运行时可以把父类的引用指向子类的实例。 在编译期间的类型安全是由编译器确定的。================================================================================不同类型的指向为什么不出错?C#可是强类型语言。2. new 也是c#的关键词吧。 CLR确保在运行时用你new的这个方法可以覆盖父类的同名方法。================================================================================如何实现的? 1、想弄明白为什么C#中基类引用可以引用派生类的对象? 我自作聪明,把问题修改一下。其实你想问的是赋值兼容问题,即 为什么可以把派生类变量赋给基类变量,而反过来不可以。举例: Animal a1; Cat c1 = new Cat(); a1 = c1; // 正确 c1 = a1; // 不对 翻译成自然语言的话,上面的第三句是说,一个猫是一个动物,第四 句则是说,一个动物是一个猫。显然动物不只是猫,也有可能是只老 鼠。从编程的角度来解释,基类的接口是派生类的子集,将派生类变 量赋给基类变量就是取接口的一部分,这会丢失一些信息,但不会引 起错误,不论你调用什么方法,在运行时,实际的对象都一定具有这 个方法。反过来,把基类变量赋值给派生类变量则是扩大接口,扩大 的部分就是派生类有而基类没有的方法。当调用派生类的方法时,不 能保证实际的对象中有这个方法。 当然并不是说基类变量一定不能赋值给派生类,可以用强制转换达到 这一目的。例如: c1 = (Cat)a1; // 行了 这样就能编译了。不过在运行时,如果 a1 引用的对象不是 Cat(或其 子类),则会引发 InvalidCastException 异常。这是 C# 最值得赞美 的特性之一,也就是常说的类型安全。在 C++ 中,使用强制转换语法 可以把指针从一个类型随意转换成另一类型,在运行时,没有异常产生, 程序运行正常,只是结果不对,接下来就是艰难的排错任务。2、new关键字在隐藏基类成员时,依据是什么,为什么可以实现隐藏? 面向对象语言具有多态性,主要是指虚函数。在C#中,有几个专门针对 虚函数的关键字:virtual, override, sealed, new,如果基类有一个 虚方法 M,派生类也有这个方法,那么派生类有两种选择:override 或者 new。override 是指重写基类的虚方法,而 new 则指示派生类的 M 和基类的 M 没有什么关系。这会影响运行时的调用行为: // 假定 Animal 有一个虚方法 Run, Animal a = new Cat(); a.Run(); 如果 Cat.Run 是 override,那么 a.Run,就会调用到 Cat.Run,表现出 多态性。如果 Cat.Run 是 new,那么 a.Run 就会调用到 Animal.Run。 概括一下,就是:如果 override,则调用运行时类型(Cat)的方法,如果 是 new,则调用编译时类型(Animal)的方法。这两个问题是C#语言中最基本的问题,有点零碎,但其实是很好懂的。 1.应用是类的继承关系来考虑。2.在new 的时候有构造函数呀,通过构造函数来考虑。 多谢楼上的各位帮忙,尤其是photoplan的生动举例。不过关于为什么会可以这样来实现,好像各位都没有说出个所以然来我请教了朋友帮我作答问题已解决再次感谢各位(赫赫,还真是微软的朋友帮忙的,盖斯手下的绝对正宗如假包换,牛人就是牛人) 0ZM 按Tab键 c# 音乐播放的问题 sql参数问题 都有哪些原因造成socket发送或者接收慢? 急!!!!!在DotNet中如何实现局域网内互相通信 crystalreport里面能否设置字段的长度! .NET网页中怎样实现一个div内的连接连接到本页的另一个div 新手提问:Socket Tcp发送数据后如何取得? 怎么获取我在表格里面的checkbox的值呢 高手come here 如何在播放视频时让LABLE的背景透明 求高手指教 winform里日期和关闭程序问题 .问件路径错误,已修改,请高手帮忙看看
为什么可以实现隐藏?我也不知道
2.new实例化对象的时候执行一个初始化器,初始化器通常也称构造函数,听清楚了,别把这个构造函数当做很神圣的东西,也就是个方法成员,凭什么不让隐藏掉?
================================================================================
不同类型的指向为什么不出错?
C#可是强类型语言。2. new 也是c#的关键词吧。 CLR确保在运行时用你new的这个方法可以覆盖父类的同名方法。
================================================================================
如何实现的?
为什么可以把派生类变量赋给基类变量,而反过来不可以。举例:
Animal a1;
Cat c1 = new Cat();
a1 = c1; // 正确
c1 = a1; // 不对
翻译成自然语言的话,上面的第三句是说,一个猫是一个动物,第四
句则是说,一个动物是一个猫。显然动物不只是猫,也有可能是只老
鼠。从编程的角度来解释,基类的接口是派生类的子集,将派生类变
量赋给基类变量就是取接口的一部分,这会丢失一些信息,但不会引
起错误,不论你调用什么方法,在运行时,实际的对象都一定具有这
个方法。反过来,把基类变量赋值给派生类变量则是扩大接口,扩大
的部分就是派生类有而基类没有的方法。当调用派生类的方法时,不
能保证实际的对象中有这个方法。 当然并不是说基类变量一定不能赋值给派生类,可以用强制转换达到
这一目的。例如: c1 = (Cat)a1; // 行了 这样就能编译了。不过在运行时,如果 a1 引用的对象不是 Cat(或其
子类),则会引发 InvalidCastException 异常。这是 C# 最值得赞美
的特性之一,也就是常说的类型安全。在 C++ 中,使用强制转换语法
可以把指针从一个类型随意转换成另一类型,在运行时,没有异常产生,
程序运行正常,只是结果不对,接下来就是艰难的排错任务。2、new关键字在隐藏基类成员时,依据是什么,为什么可以实现隐藏?
面向对象语言具有多态性,主要是指虚函数。在C#中,有几个专门针对
虚函数的关键字:virtual, override, sealed, new,如果基类有一个
虚方法 M,派生类也有这个方法,那么派生类有两种选择:override
或者 new。override 是指重写基类的虚方法,而 new 则指示派生类的
M 和基类的 M 没有什么关系。这会影响运行时的调用行为:
// 假定 Animal 有一个虚方法 Run,
Animal a = new Cat();
a.Run();
如果 Cat.Run 是 override,那么 a.Run,就会调用到 Cat.Run,表现出
多态性。如果 Cat.Run 是 new,那么 a.Run 就会调用到 Animal.Run。
概括一下,就是:如果 override,则调用运行时类型(Cat)的方法,如果
是 new,则调用编译时类型(Animal)的方法。
这两个问题是C#语言中最基本的问题,有点零碎,但其实是很好懂的。
2.在new 的时候有构造函数呀,通过构造函数来考虑。
不过关于为什么会可以这样来实现,好像各位都没有说出个所以然来
我请教了朋友帮我作答
问题已解决
再次感谢各位
(赫赫,还真是微软的朋友帮忙的,盖斯手下的绝对正宗如假包换,牛人就是牛人) 0ZM