c#如何重写类?

 我来答
冷小瞳233
推荐于2019-11-17 · TA获得超过781个赞
知道答主
回答量:18
采纳率:100%
帮助的人:2407
展开全部

我们首先要写一个自定义的事件参数,为了简单起见,我们的自定义按钮控件,增加一个TagNumber属性,它传递一个整型数据,当我们处理控件的Click事件,能够从事件参数类实例中取得我们在这个属性中设置的值,因此,我们需要一个MyButtonClickAgre,它从EventArgs类派生。

[csharp] view plaincopyprint?

  • /// <summary>  

  • /// 自定义事件参数类。  

  • /// </summary>  

  • internal class MyButtonClickAgre : EventArgs  

  • {  

  • int _value;  

  • public MyButtonClickAgre(int n)  

  • {  

  • this._value = n;  

  • }  

  • public int TheNumber  

  • {  

  • get { return this._value; }  

  • }  

  • }  


  • 现在,从Button类派生一个新类。

    [csharp] view plaincopyprint?

  • public class MyButton:Button  

  • {  

  • int _num;  

  • // 构造函数  

  • public MyButton()  

  • : base()  

  • {  

  • this._num = 0;  

  • }  

  • /// <summary>  

  • /// 用作参数传递的整型数据。  

  • /// </summary>  

  • [System.ComponentModel.Browsable(true)]  

  • [System.ComponentModel.Description("获取或设置一个整数。")]  

  • [System.ComponentModel.Category("数据")]  

  • public int TagNumber  

  • {  

  • get { return this._num; }  

  • set { this._num = value; }  

  • }  

  • }  

  • 好,TagNumber属性定义好了,Browsable特性表示控件中设计时是否显示在“属性”窗口中,Description用一些文本描述属性有什么用途这类的信息,Category表示该属性在“属性”窗口属于哪个类别,可能很多人觉得要传递一个英文的字符串作为分类名,其实不一定,如果你的VS是中文版的,你完全可以使用中文名字,如上面的“数据”。

    在“属性”窗口中浏览该控件的属性如下图所示。

    下面,我们还有一件重要的事情要做,那就是重写基类的Click事件。这里有两种方法:

    1、第一种方法不算得上是重写事件,应该说是我们经常做的重写On????方法,如我们下面要通过重写OnClick方法来达到我们要的效果。

    [csharp] view plaincopyprint?

  • /// <summary>  

  • /// 重写OnClick方法。  

  • /// </summary>  

  • protected override void OnClick(EventArgs e)  

  • {  

  • base.OnClick(new MyButtonClickAgre(this._num));  

  • }  


  • 这样,我们自定义的事件参数就传到事件处理程序了。

    2、第二种方法才算是重写事件,通过new关键字重新定义一个Click事件。

    [csharp] view plaincopyprint?

  • // 新的Click事件。  

  • public new EventHandler Click;  

  • /// <summary>  

  • /// 重写OnClick方法。  

  • /// </summary>  

  • protected override void OnClick(EventArgs e)  

  • {  

  • if (Click != null)  

  • {  

  • Click(this, new MyButtonClickAgre(this._num));  

  • }  

  • }  


  • 这个时候,我们就不需要基类的OnClick方法了,所以也不用再写上base.OnClick(e);。

    现在,我们重新生成一下项目,切换到WinForm设计器窗口,在工具箱中就能看到我们自定义的控件了。

    好,现在可以测一测这个新控件了。

    [csharp] view plaincopyprint?

  • public partial class Form1 : Form  

  • {  

  • public Form1()  

  • {  

  • InitializeComponent();  

  • }  

  • private void myButton1_Click(object sender, EventArgs e)  

  • {  

  • if (e is MyButtonClickAgre)  

  • {  

  • MyButtonClickAgre ce = e as MyButtonClickAgre;  

  • if (ce != null)  

  • {  

  • MessageBox.Show(ce.TheNumber.ToString());  

  • }  

  • }  

  • }  

  • }  

推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式