c# virtual 和 override 好像没用的呀
开发环境vs2005
class a
{
internal virtual void am(){Console.Write( "am ");}
}
class b : a
{
internal override void am(){Console.Write( "b.am ");}
}
-------------------------------------------------------
把virtual和override去掉,效果一样。
为什么呀?
------解决方案--------------------你用 ((a)(new b())).am(); 就知道效果不一样了
------解决方案--------------------当然不一样了~
------解决方案--------------------加override关键字,重写基类的方法,有多态性
不加的话,默认是隐藏,相当于加了new关键字,无多态
------解决方案--------------------不一样
.virtual表示的是可fu盖,而overrede是fu盖...
------解决方案--------------------不懂别乱讲。
多看看书去吧!
------解决方案--------------------b b1 = new b();
a a1 = b1;
a1.am();
你用这段代码实验下 结果应该不同
------解决方案--------------------反汇编下就知道区别了:
不写 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 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();
------解决方案--------------------使用override修饰符主要用来修改方法、属性、索引器或事件。重写方法提供从基类继承的成员的新实现。由重写声明重写的方法称为重写基方法。重写基方法必须与重写方法具有相同的名称。
不能重写非虚方法或静态方法。重写基方法必须是虚拟的、抽象的或重写的。