学点C# 4 继承 & 事件

原创 2011年01月12日 17:52:00

继承

  • :相当于 extends & implements
  • base相当于super
  • 选择构造函数“:base()”
    • public class ColorCoOrds : CoOrds
      {
          public System.Drawing.Color color;
      
          public ColorCoOrds() : base ()
          {
              color = System.Drawing.Color.Red;
          }
      
          public ColorCoOrds(int x, int y) : base (x, y)
          {
              color = System.Drawing.Color.Red;
          }
      }
  • Java 和 C# 的一个重要区别是:默认情况下,Java 方法被标记为 virtual,而在 C# 中,必须使用 virtual 修饰符将方法显式标记为 virtual。属性访问器和方法均可以重写,它们的重写方法非常相似。
  • 在派生类中,已重写的方法是使用 override 修饰符声明的。它代替基类中具有相同名称和签名的方法或属性。
  • 要重写的基方法必须声明为 virtualabstract 或 override:不能按此方式重写非虚方法或非静态方法。已重写和正在重写的方法或属性必须具有同样的访问级别修饰符。
    • public class CountClass 
      {
          public int count; 
      
          public CountClass(int startValue)  // constructor
          {
              count = startValue;
          }
      
          public virtual int StepUp()
          {
              return ++count;
          }
      }
      
      class Count100Class : CountClass 
      {
          public Count100Class(int x) : base(x)  // constructor 
          {
          }
      
          public override int StepUp()
          {
              return ((base.count) + 100);
          }
      }
      
      class TestCounters
      {
          static void Main()
          {
              CountClass counter1 = new CountClass(1);
              CountClass counter100 = new Count100Class(1);
      
              System.Console.WriteLine("Count in base class = {0}", counter1.StepUp());
              System.Console.WriteLine("Count in derived class = {0}", counter100.StepUp());
          } 
      }
      
       
  • abstract关键字同Java
  • 接口声明方式与 Java 中的声明方式相同。在接口定义中,属性仅指示它的类型,并仅通过 get 和 set 关键字指示它为只读、只写还是读/写。如果为某个接口成员指定了任何修饰符,编译器将产生一个错误。以下接口声明一个只读属性:
    • public interface ICDPlayer
      { 
          void Play();  // method signature
          void Stop();  // method signature
      
          int FastForward(float numberOfSeconds);
      
          int CurrentTrack  // read-only property
          {
              get;
          } 
      }
  • 实现多重接口 public class CDAndDVDComboPlayer : ICDPlayer, IDVDPlayer
  • 派生类可以使用方法的完全限定名称表明此派生类属于哪个接口,从而解决冲突,这与 ICDPlayer.Play() 中一样

 

事件

  • 与 Java 中的事件处理(通过实现自定义侦听器类执行)不同,C# 开发人员可以使用委托进行事件处理。委托是一种封装方法的类型。一旦使用方法初始化委托后,委托的行为方式就与该方法完全相同,且可以使用 () 运算符调用。它与 C++ 函数指针类似,但它是类型安全的。您可以通过委托调用方法。委托用于将方法作为参数传递给其他方法。
  • 与委托的签名(由返回类型和参数组成)匹配的任何可访问类或结构中的任何方法都可以分配给该委托。方法可以是静态方法,也可以是实例方法。这样就可以通过编程方式来更改方法调用,还可以向现有类中插入新代码。只要知道委托的签名,就可以分配您自己的方法。例如,可以向排序算法传递对比较两个对象的方法的引用。分离比较代码使得可以采用更通用的方式编写算法。
    • public delegate int PerformCalculation(int x, int y);

      在 Windows 用户界面编程中,通常使第一个参数作为引用事件源的对象,使第二个参数作为携带与事件相关的数据的对象。但是,在 C# 语言中并不强制使用这种形式;只要事件签名返回 void,其他方面可以与任何有效的委托签名一样。

      事件可以使用 event 关键字进行声明,如下例所示:

      public event MyEventHandler TriggerIt;
      

      若要触发该事件,请定义引发该事件时要调用的方法,如下例所示:

      public void Trigger()
      {
          TriggerIt();
      }
      

      若要引发事件,可以调用委托,并传递与该事件相关的参数。然后,该委托将调用已添加到该事件中的所有处理程序。每个事件都可以分配多个处理程序来接收该事件。在这种情况下,该事件将自动调用每个接收方。无论有多少个接收方,引发一个事件都只需调用一次该事件。

      如果希望某个类接收事件,请通过使用 += 运算符向该事件添加委托来订阅该事件,例如:

      myEvent.TriggerIt += myEvent.MyMethod;
      

      若要取消预订事件,请使用 -= 运算符将委托从事件中移除,例如:

      myEvent.TriggerIt -= new MyEventHandler(myEvent.MyMethod);

C#(模板模式)将父窗体继承之后重写一个按钮的事件,为什么每次都要运行两次才结束?

父窗体中的事件代码 protected virtual void btnFind_Click(object sender, EventArgs e) {            //内容 }   子窗体...
  • h273979586
  • h273979586
  • 2017年01月18日 10:20
  • 689

c#事件的继承处理

有下面一段代码,目的是实现事件的继承:  基类:     public class BaseBusiness     {         //声明事件委托         public ...
  • sinat_35551809
  • sinat_35551809
  • 2016年07月18日 10:20
  • 473

C#接口事件的实现解析

C#接口事件的实现是如何的呢?下面的C#接口事件示例演示如何在类中实现接口事件。实现C#接口事件的规则与实现任何接口方法或属性的规则基本相同。C#接口事件实例:在类中实现接口事件,在类中声明事件,然后...
  • gaoyongxing
  • gaoyongxing
  • 2010年08月21日 01:27
  • 843

c# 接口繼承

using System; using System.Collections.Generic; using System.Text; namespace ConsoleApplica...
  • zhuzhao
  • zhuzhao
  • 2009年12月11日 11:25
  • 465

每天学点数据库之-----Day 1-数据库的一些基本概念

每天一点数据库之-----Day 1-数据库的一些基本概念                                                                    ...
  • zpj779878443
  • zpj779878443
  • 2015年02月07日 17:15
  • 7764

C#中自定义控件隐藏基类成员(属性、方法和事件)的方法

编写自定义控件时,总是继承C#中提供的Control类,而Control类是C#中所有窗体控件的基类,里面定义了大量的属性、方法和事件,而很多基类成员在自定义控件中可能不需要,因为编写者会希望在自定义...
  • XueminXu
  • XueminXu
  • 2013年10月12日 11:33
  • 2376

C#控件的事件重写的理解与自我观点

由于我是从VFP开发转往C#开发的,所以常常想在C#理去实现VFP中的一些写法,例如这次.. 在VFP中,我们的为了适应开发的多变性,所以我们开发了很多继承于VFP控件的类控件,把很多常用的处理代码,...
  • turejackon
  • turejackon
  • 2009年10月21日 12:12
  • 4125

学点C#

首先来看一下.NET Framework的组成,如下图所示:包括了3个方面的内容,1. CLR(Common Language Runtime,公共语言运行库)。负责在运行时管理软件的执行。包括内存的...
  • xingguo822
  • xingguo822
  • 2010年12月27日 15:01
  • 364

C# 事件与继承

           在已有类中定义事件,为事件指定方法(虚方法A),子类中重写虚方法(重写方法A)B,那么在事件出发时,调用的是方法B。     publicclassClsBase {   pub...
  • chenwei9120
  • chenwei9120
  • 2011年05月20日 14:39
  • 540

C# 事件的继承

有下面一段代码,目的是实现事件的继承: 基类:    public class BaseBusiness    {        //声明事件委托        public delegate voi...
  • mjh11310
  • mjh11310
  • 2007年06月20日 11:12
  • 500
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:学点C# 4 继承 & 事件
举报原因:
原因补充:

(最多只允许输入30个字)