子类中不要加
protected virtual void cmdF1_Click(object sender, System.EventArgs e)
{
Console.WriteLine("Extend Click");
MessageBox.Show("Extend Click");
}
段代码不就好。
protected virtual void cmdF1_Click(object sender, System.EventArgs e)
{
Console.WriteLine("Extend Click");
MessageBox.Show("Extend Click");
}
段代码不就好。
父类的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处理。
父类就可以控制住是否允许子类执行。
子类中的当然要覆盖父类的方法了。
{
Console.WriteLine("Extend Click");
MessageBox.Show("Extend Click");
}
protected System.Windows.Forms.Button cmdF2;这两个按钮在父类和子类里都出现了
既然是相同名称,也就是说子类里的会把父类里的覆盖这是你的原意吗?还是个错误?
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
}
}
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:其实,这个设计和你原来的设计,都不是实现你所说的需求的最佳途径。
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 要做的事情
}
}
基类里写公共需要实现的部分
派生类去override。有一点,override里选择的去调用:mybase.f1_click()
protected virtual void cmdF1_Click(object sender, System.EventArgs e)
{
base.cmdF1_Click(sender,e);
}