继承
:相当于 extends & implementsbase相当于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 修饰符声明的。它代替基类中具有相同名称和签名的方法或属性。要重写的基方法必须声明为 virtual、abstract 或 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);