主题:C#.net中的重写和覆盖有什么区别吗?
懂历史的猫
[专家分:0] 发布于 2006-03-06 18:39:00
C#中的子类重写父类的方法和用NEW隐藏父类的方法,这两者之间有什么区别呢??都是让子类的同名方法和父类的同名方法有不同的方法体啊?有什么区别?是不是就是重写的或必须是虚方法这点啊?
回复列表 (共6个回复)
沙发
eastcowboy [专家分:25370] 发布于 2006-03-06 20:55:00
有区别的。
override是重写一个virtual方法,这样将能够体现面向对象中的“多态性”。而new是真正的覆盖,没有“多态性”。比如说我写:
using System;
using System.Windows.Forms;
public class MyForm1 : System.Windows.Forms.Form
{
protected override void OnClick(EventArgs e)
{
MessageBox.Show("Hello");
}
}
public class MyForm2 : System.Windows.Forms.Form
{
protected new void OnClick(EventArgs e)
{
MessageBox.Show("Hello");
}
}
public class MainFunction
{
public static void Main()
{
Form frm1 = new MyForm1();
frm1.Text = "Form1";
frm1.ShowDialog();
Form frm2 = new MyForm2();
frm2.Text = "Form2";
frm2.ShowDialog();
}
}
注意在Main函数中,frm1和frm2看起来都是Form类型,但它们的OnClick一个是override,一个是new。用鼠标点击的话,可以发现frm1会显示消息“Hello”,而第二个就没什么反应。
板凳
redsky9919 [专家分:570] 发布于 2006-03-07 10:28:00
学习!
3 楼
懂历史的猫 [专家分:0] 发布于 2006-03-07 10:59:00
eastcowboy
第二个窗体为什么会没有反应??覆盖了原方法,但是新方法里面也有显示HELLO这个功能啊?为什么会没有反应呢?不懂了。
4 楼
eastcowboy [专家分:25370] 发布于 2006-03-07 17:41:00
1楼程序中,由于MyForm1和MyForm2都是Form类的子类,所以可以有这样的语句:
Form frm1 = new MyForm1();
//创建一个MyForm1对象,但把它的引用赋值给一个Form类型的变量frm1
Form frm2 = new MyForm2();
//创建一个MyForm2对象,但把它的引用赋值给一个Form类型的变量frm2
这样一来,frm1和frm2看起来都是Form类型,但其实它们一个是MyForm1类型,一个是MyForm2类型。
在Form类中,OnClick是一个virtual函数,所以调用Form类的OnClick函数时,会检查这个对象究竟是一个“Form类的对象”还是一个“Form类的子类的对象”。如果是前者,将直接调用Form类的OnClick,如果是后者,并且对应子类中使用override将OnClick重写,则将调用对应子类的OnClick。这就是所谓的“多态”。
使用new的话,就是直接覆盖了,父类和子类中的OnClick函数除了名称相同外没有别的联系,也就没有“多态”了。
5 楼
peak9257 [专家分:50] 发布于 2006-03-10 17:36:00
class A
{
public virtual void F()
{
MessageBox.Show("a.f");
}
}
class B : A
{
public override void F()
{
MessageBox.Show("b.f");
}
}
class C : A
{
new public void F()
{
MessageBox.Show("c.f","mm");
}
}
自己创建的类
private void button1_Click(object sender, System.EventArgs e)
{
B b = new B();
A a = b;
a.F();
b.F();
}
private void button2_Click(object sender, System.EventArgs e)
{
C c = new C();
A a = c;
a.F();
c.F();
}
点击button1的结果
b.f
b.f
点击button2的结果
a.f
c.f
6 楼
hellogxp [专家分:0] 发布于 2008-03-29 10:24:00
button2_Click里的结果有点不太明白,请指点.
我来回复