读书人

c# virtual 和 override 好像没用的呀

发布时间: 2012-01-18 00:23:26 作者: rapoo

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修饰符主要用来修改方法、属性、索引器或事件。重写方法提供从基类继承的成员的新实现。由重写声明重写的方法称为重写基方法。重写基方法必须与重写方法具有相同的名称。
不能重写非虚方法或静态方法。重写基方法必须是虚拟的、抽象的或重写的。


重写声明不能更改虚方法的可访问性。重写方法和虚方法必须具有相同的访问级修饰符。例如:虚方法为public的,重新方法也必须是public的。
不能使用下列修饰符修改重写方法:
new static virtual abstract

重写属性声明必须指写与继承属性完全相同的访问修饰符、类型和名称,并且重写属性必须是虚拟的、抽象的或是重写的。

要求:(三相同)
1、方法名称相同
2、参数列表相同
3、返回值类型相同
一句话,只需要重新写方法内部的内容!


,override可以覆盖基类的方法,让基类的方法以子类的内容实现,而new不用来覆盖基类的方法,而是全新定义一个子类的方法,这个方法只属于子类,与基类的方法无关,只是名字上相同而已.

以上内容转载自 "中国教育人博客 "
[解决办法]
a _a = new b();
_a.am();
你看一下两种结果。

读书人网 >C#

热点推荐