各位大侠:
   我是用VS2008做开发工具
   代码如下:
    A.定义一个FORM做父类,其中的BUTTON事件如下,
    namespace test
    public partial class TempForm : Form
    {
      ...
        public System.Windows.Forms.Button BtnExcel;        public virtual void BtnExcel_Click(object sender, EventArgs e)
        {
            MessageBox.Show("Parent Calling");
        }     B。定义一个子表单,并重写方法。
     namespace test
     public partial class MatCode :TempForm
     {
        public MatCode()
        {
            InitializeComponent();
        }        override public void BtnExcel_Click(object sender, EventArgs e)
        {
              MessageBox.Show("child calling");
        }     }
 
     我重测试时为何不能显示Child calling,却总是显示Parenting. 我想要的结果是先显示parent calling 
     再显示child calling.TKS!

解决方案 »

  1.   

    多态的条件:基类的指针或引用来调用虚函数,才会发生多态
    TempForm tf=new Matcode();
    tf.BtnExcel_Click(tf.BtnExcel,new EventArgs());
      

  2.   

    override void OnClick(EventArgs e)这用的是事件绑定的委托方法,不能那样用override,机制都不同...好好看看MSDN,把委托和事件搞清楚...
      

  3.   


    赞同~ vrhero 仍然强人
      

  4.   

    楼主的方法定义为一个虚方法为什么不能多态?事件处理方法难道不是函数么?
    父窗体的构造函数中调用了InitializeComponent方法,该方法将窗体上的按钮的点击事件委托给一个虚方法,当子类继承这个窗体时重写该方法,此时初始化组件的方法将事件委托给子窗体的方法(该方法重载了父类的处理方法),这个没有问题。public override void BtnExcel_Click(object sender, EventArgs e) {
        base.BtnExcel_Click(sender, e); //先调用父类的方法
        MessageBox.Show("child calling");//再执行自己的方法体
    }
      

  5.   

    同意 cuike519
    可以的,楼主没有调用 base.BtnExcel_Click(sender, e); //先调用父类的方法
    很奇怪其他人的回复。还有楼主说【却总是显示Parent ing】我也很奇怪,是否使用的也不正确呢?
     
      

  6.   

    cuike519说的也对,虽然是委托方法,但一样可以override...不应该发生楼主描述的情况...
      

  7.   

    虽然可以用tf.BtnExcel_Click()来调用你的派生类的方法了,但是你在界面上用按钮点击时,仍然不能发生多态,因为这是静态绑定好的,
      

  8.   

    各位大虾,偶以为问题在这里,下面是执行子窗体的代码
            public void MMSysCode_Click(object sender, EventArgs e)
            {
                TempForm MatCode = new TempForm();
                MatCode.Show();
            }
    执行结果并没有显示MATCODE,而是显示的TempForm的内容,不知错在那里了。
      

  9.   

    绑定的只是方法指针,与该方法是否被override没有关系...事件通过委托调用该方法时仍然会override...
      

  10.   


    但是你界面上的按钮的Click事件添加的是BtnExcel_Click()这个函数,你没有办法通过OnClick()方法来调用派生类override之后的BtnExcel_Click()函数,难道这里也能发生多态吗?
      

  11.   

    重载不是叫overload吗,怎么说的是override
    这两个单词很像?