子类中不要加
protected virtual void cmdF1_Click(object sender, System.EventArgs e)
{
Console.WriteLine("Extend Click");
MessageBox.Show("Extend Click"); 


 
}
段代码不就好。

解决方案 »

  1.   


    父类的protected virtual void cmdF1_Click(object sender, System.EventArgs e)
    改为私有类型。
    private void cmdF1_Click(object sender, System.EventArgs e)
    另外提供一个新的方法:
    protected virtual void OnCmdF1Click(object sender, System.EventArgs e)
    在cmdF1_Click中调用。子类重载OnCmdF1Click方法,来执行Click处理。
    父类就可以控制住是否允许子类执行。
      

  2.   

    如果那样,要子类中的cmdF1_Click作什么???
    子类中的当然要覆盖父类的方法了。
      

  3.   

    adailee(为了一棵树,我放弃了整个森林)  的方法比较好。
      

  4.   

    protected override void cmdF1_Click(object sender, System.EventArgs e)
    {
    Console.WriteLine("Extend Click");
    MessageBox.Show("Extend Click"); 


     
    }
      

  5.   

    我是楼主,对不起各位高手可能我没有把设计思路说清楚,因为现在有100多个画面(Form)要完成,每个Form都有F1功能键,F1按下时有操作员权限check(共通机能),因此我想把权限check移到父类里去实现,而子类也就是各画面Form不用再关心此机能,因此才有顶楼的问题,麻烦各位高手看看还有什么好的设计思路。特别请adailee(为了一棵树,我放弃了整个森林) 能详细说明一下你的方法吗?
      

  6.   

    你的代码本身有不清楚的地方,protected System.Windows.Forms.Button cmdF1;
    protected System.Windows.Forms.Button cmdF2;这两个按钮在父类和子类里都出现了
    既然是相同名称,也就是说子类里的会把父类里的覆盖这是你的原意吗?还是个错误?
      

  7.   

    用hary90(hary90)的办法,重写方法就行啦
      

  8.   

    对不起DotNetFreak(),实际上是我贴错代码了,那两行代码其实是不存在的,子类的全部源代码应该是这样的:
    using System;
    using System.Drawing;
    using System.Collections;
    using System.ComponentModel;
    using System.Windows.Forms;
    using FatherFormSpace;namespace ExtendForm
    {
    /// <summary>
    /// ExtendForm 的摘要说明。
    /// </summary>
    public class ExtendForm : FatherForm
    {
    /// <summary>
    /// 必需的设计器变量。
    /// </summary>
    private System.ComponentModel.Container components = null; public ExtendForm()
    {
    //
    // Windows 窗体设计器支持所必需的
    //
    InitializeComponent(); //
    // TODO: 在 InitializeComponent 调用后添加任何构造函数代码
    //
    } /// <summary>
    /// 清理所有正在使用的资源。
    /// </summary>
    protected override void Dispose( bool disposing )
    {
    if( disposing )
    {
    if(components != null)
    {
    components.Dispose();
    }
    }
    base.Dispose( disposing );
    }

    protected new void cmdF1_Click(object sender, System.EventArgs e)
    {

    Console.WriteLine("Extend Click");
    MessageBox.Show("Extend Click"); 


    }
    #region Windows 窗体设计器生成的代码
    /// <summary>
    /// 设计器支持所需的方法 - 不要使用代码编辑器修改
    /// 此方法的内容。
    /// </summary>
    private void InitializeComponent()
    {
    this.SuspendLayout();
    // 
    // cmdF1
    // 
    this.cmdF1.Name = "cmdF1";
    this.cmdF1.Click += new System.EventHandler(this.cmdF1_Click);
    // 
    // cmdF2
    // 
    this.cmdF2.Name = "cmdF2";
    // 
    // ExtendForm
    // 
    this.AutoScaleBaseSize = new System.Drawing.Size(6, 14);
    this.ClientSize = new System.Drawing.Size(292, 273);
    this.Name = "ExtendForm";
    this.Text = "ExtendForm";
    this.ResumeLayout(false); }
    #endregion


    }
    }
      

  9.   

    To brightheroes(闭关|那一剑的风情):晕,不会那么复杂吧,偶对hook可是一窍不通啊。
      

  10.   

    我的意思,见下面的伪代码public class FathterForm{  protected Button F1Button; //你的F1按钮  void InitializeComponent(){
        this.F1Button.Click += new EventHandler( this.F1ButtonClick );
        //绑定事件    
      }
      private void F1ButtonClick( object sender, EventArgs e ){
        this.OnF1ButtonClick( sender, e ); //调用处理方法
        //你可以决定是否调用它。因为子类可能自己会实现OnF1ButtonClick方法。
      }
      protected virtual void OnF1ButtonClick(object sender, EventArgs e ){
        //实际处理的F1按钮功能,供子类进行实现
        //你可以在这里加上默认的实现
      }
    }public class SubForm:FatherForm{
      protected override void OnF1ButtonClick(object sender, EventArgs e){
        //当你需要特别处理的时候,在这里处理
        base.OnF1ButtonClick(sender, e ); //调用父类的处理
      }
      //子类不需要再帮定F1Button的Click事件
    }PS:其实,这个设计和你原来的设计,都不是实现你所说的需求的最佳途径。
      

  11.   

    在子类方法中调用base.cmdF1_Click()
      

  12.   

    根据你说的要求,我有以下的架构建议
    public class FatherForm : System.Windows.Forms.Form
    {
      //这个按钮就让FatherForm 拥有就够了
      private System.Windows.Forms.Button cmdF1;
        private void InitializeComponent(){
        this.cmdF1.Click += new EventHandler( this.cmdF1_Click);
        //绑定事件    
      }  //这个event handler 也是private 就够了
      private void cmdF1_Click(object sender, System.EventArgs e)
      {
        if( Check() )
          OnF1Clicked(); 
      }  private bool Check(){...}  //这个可以让子类override, 但这个父类总会做Check
      protected virtual OnF1Clicked()
      {
      }
    }public class ExtendForm1 : FatherForm
    {
      protected override OnF1Clicked()
      {
        //做 ExtendForm1 要做的事情,也可以什么都不做,或者根本就没有这个override
       }
    }public class ExtendForm2 : FatherForm
    {
      protected override OnF1Clicked()
      {
        //做 ExtendForm2 要做的事情
       }
    }
      

  13.   

    base class的方法定义成virtual,子类可以override覆盖,或者new也行。
      

  14.   

    我觉得上面的方法改改就好了
    基类里写公共需要实现的部分
    派生类去override。有一点,override里选择的去调用:mybase.f1_click()
      

  15.   

    同意楼上  wuyazhe(Love Is A Word.) 的办法
      

  16.   

    子方法用base来回到父类定义就可以了,就你的想法来说,就是:
    protected virtual void cmdF1_Click(object sender, System.EventArgs e)
    {
        base.cmdF1_Click(sender,e);
    }