开发环境vs2005class a
{
internal virtual void am(){Console.Write("am");}
}
class b : a
{
internal override void am(){Console.Write("b.am");}
}-------------------------------------------------------把virtual和override去掉,效果一样。为什么呀?
{
internal virtual void am(){Console.Write("am");}
}
class b : a
{
internal override void am(){Console.Write("b.am");}
}-------------------------------------------------------把virtual和override去掉,效果一样。为什么呀?
解决方案 »
- C# datagridview 标题栏
- C# 中 sql语句排序问题....
- winfrom 中让用户自由移动控件
- 求一个最简单的3层开发的例子
- 关于C#中的字符串提取函数,如何提取c:\\data\name.dat中的name.dat文件名?
- 关于数据库的问题:我用的一个软件的数据库文件的后缀名为:pbm和syb,请教一下这个数据库是什么数据库?
- 求助 stack trace 中信息。
- 求助:寻求嵌入 百度 或 google 的搜索引擎代码。
- 请教一个问题:请大家帮帮我,谢谢,200分
- 还是正则表达式的问题,各位老大别嫌麻烦。
- c# 类 默认构造函数
- 如何让combobox只能够选择,不能够自己输入
不加的话,默认是隐藏,相当于加了new关键字,无多态
.virtual表示的是可fu盖,而overrede是fu盖...
a a1 = b1;
a1.am();你用这段代码实验下 结果应该不同
.method public hidebysig newslot virtual
instance void am() cil managed
{
// 代码大小 13 (0xd)
.maxstack 8
IL_0000: nop
IL_0001: ldstr "am "
IL_0006: call void [mscorlib]System.Console::Write(string)
IL_000b: nop
IL_000c: ret
} // end of method a::am类B的am方法
.method public hidebysig instance void am() cil managed
{
// 代码大小 13 (0xd)
.maxstack 8
IL_0000: nop
IL_0001: ldstr "b.am"
IL_0006: call void [mscorlib]System.Console::Write(string)
IL_000b: nop
IL_000c: ret
} // end of method b::am
比较下
类a的方法 .method public hidebysig newslot virtual
instance void am() cil managed
类b的方法 .method public hidebysig instance void am() cil managed发现没,b 的am方法完全把a的给覆盖了再看看加上override的:
类a的am方法
.method public hidebysig newslot virtual
instance void am() cil managed
{
// 代码大小 13 (0xd)
.maxstack 8
IL_0000: nop
IL_0001: ldstr "am "
IL_0006: call void [mscorlib]System.Console::Write(string)
IL_000b: nop
IL_000c: ret
} // end of method a::am类b的am方法:
.method public hidebysig virtual instance void
am() cil managed
{
// 代码大小 13 (0xd)
.maxstack 8
IL_0000: nop
IL_0001: ldstr "b.am"
IL_0006: call void [mscorlib]System.Console::Write(string)
IL_000b: nop
IL_000c: ret
} // end of method b::am
看下现在b的方法:
.method public hidebysig virtual instance void
am() cil managed发现什么没?现在是b的am方法也是virtual的。。说明它继承了a的方法并且把他重写了。
所以区别就是:
如果不加,类b的方法就会类a的方法隐藏掉。
如果加上override,它会把继承类a的方法,并且把类a重写,那么b的am方法也成了viritual的
a test1 = new a();
test1.am();
test1 = new b();
test1.am();
不能重写非虚方法或静态方法。重写基方法必须是虚拟的、抽象的或重写的。
重写声明不能更改虚方法的可访问性。重写方法和虚方法必须具有相同的访问级修饰符。例如:虚方法为public的,重新方法也必须是public的。
不能使用下列修饰符修改重写方法:
new static virtual abstract 重写属性声明必须指写与继承属性完全相同的访问修饰符、类型和名称,并且重写属性必须是虚拟的、抽象的或是重写的。要求:(三相同)
1、方法名称相同
2、参数列表相同
3、返回值类型相同
一句话,只需要重新写方法内部的内容!
,override可以覆盖基类的方法,让基类的方法以子类的内容实现,而new不用来覆盖基类的方法,而是全新定义一个子类的方法,这个方法只属于子类,与基类的方法无关,只是名字上相同而已.以上内容转载自"中国教育人博客"
_a.am();
你看一下两种结果。