>> 其他对象语言默认都是可以多态
C++就不是这样,而且多态是牺牲时间/空间性能换取灵活性的,其决定权应该在组件设计者的手里,而不是系统不分青红皂白的一律设置成可以覆盖。而且所有的方法都是virtual对系统的安全特性也不好。
至于什么时候应该是用virtual,那是Design Pattern的课题,不是语言设计。单就多态特性来说,C#就更贴近C++而不是Java,除了加了override, new关键字来避免C++里面可能出现的问题之外,就功能来说基本上和C++是相同的。
C++就不是这样,而且多态是牺牲时间/空间性能换取灵活性的,其决定权应该在组件设计者的手里,而不是系统不分青红皂白的一律设置成可以覆盖。而且所有的方法都是virtual对系统的安全特性也不好。
至于什么时候应该是用virtual,那是Design Pattern的课题,不是语言设计。单就多态特性来说,C#就更贴近C++而不是Java,除了加了override, new关键字来避免C++里面可能出现的问题之外,就功能来说基本上和C++是相同的。
解决方案 »
- 水晶报表不能预览问题??
- winform中的form问题
- 命名空间不能直接包含字段或方法之类的成员
- 请教:DataList中如何动态设置Headertemplate模板中控件的值?
- c#实现根据条件在EXcel找到单元格里的值并添写一句话,并将这句话输出到txt文档中
- string[]和TreeNode 问题
- C#中 有没有一种方法 导出 一个类的所有方法名 和 注释 到记事本中 或其他地方
- 怎样才能在textbox1中按一下回车键,光标移动到textbox2中?
- 请问C#中WinForm里有和WebForm里的框架frameset一样的机制吗?谢谢了!
- 怎样在不用打开VS.net 的情况下编译运行c#文件?
- 这个SQL语句怎么写?
- 在c#中操纵word
《C# Essentials》 p47有个例子,正合你胃口。
----------------------------
当没有加new时,系统会给出一个警告,然后系统会当作加了new来处理,也就是会隐藏base class的同名方法(当然,参数也相同)。
2,如果 father里面不用virtual public void test(),则child里面无论怎么
搞,都不能实现多态,因为 father f=new child(); f.test();都是调用了
father中的方法,而不是child的.所以要实现多态,比如father里面用了virtual
child里面用override才可以,也就是说,如果father不想你这样作,child是没有办法多态的
-----------------------------------------------------
这就是.Net内置的versioning控制了,3, 其他对象语言默认都是可以多态,也就是子类可以覆盖父类中的方法,
为什么c#要默认不可以这样,c#这样设定有什么好处吗?不了解
------------------------------------------------------
好处有好多的
1。多态是用时间换取的,通过只让明确声明的方法可以多态,可提高运行速度。
2。通过明确的告诉编译器你想做什么,可减少不必要的逻辑错误。大部分方法展现出来只是给使用,而不是给override。一旦override很可能引起base class错误。
3。...还有一些,我不知道怎么说,那位大虾补充一下!