回 帖 发 新 帖 刷新版面

主题:C#.net中的重写和覆盖有什么区别吗?

C#中的子类重写父类的方法和用NEW隐藏父类的方法,这两者之间有什么区别呢??都是让子类的同名方法和父类的同名方法有不同的方法体啊?有什么区别?是不是就是重写的或必须是虚方法这点啊?

回复列表 (共6个回复)

沙发

有区别的。
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”,而第二个就没什么反应。

板凳

学习!

3 楼

eastcowboy
第二个窗体为什么会没有反应??覆盖了原方法,但是新方法里面也有显示HELLO这个功能啊?为什么会没有反应呢?不懂了。

4 楼

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 楼


  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 楼

button2_Click里的结果有点不太明白,请指点.

我来回复

您尚未登录,请登录后再回复。点此登录或注册