- A.接口:一种约定,使得实现接口的类或结构在形式上保持一致。好处:使得程序更条理清晰。
B.接口声明:接口中只能包含属性,方法,索引器和时间的声明。接口成员的声明不能有修饰符(默认为Public)。
public interface IBankAccount
{
????void PayIn(decimal amount);
????bool Withdraw(decimal amount);
????decimal Balance
????{get;}
}
C.接口实现类:继承接口的实现类必须实现接口中声明的所有方法。
D.实例声明为接口的引用: IBankAccount venusAccount = new SaverAccount();这样可以让它指向这个接口任何类的实例,比较灵活。缺点:要执行不属于这个接口的方法,需要先将把接口的引用强制转换成合适的类。
E.接口的继承:接口可以彼此继承。
interface ITransferBankAccount:IBankAccount
{
bool TransferTo(IBankAccount destination,decimal amount);
}//实现接口ITransferBankAccount的类,必须实现IBankAccount和ITransferBankAccount两个接口所有的方法声明。
F.总结:
C#接口独立于类来定义(C++接口实际上就是抽象基类)
接口和类都可以继承多个接口
类可以继承一个基类,接口不能继承类。
一个接口定义一个只有抽象成员的引用类型。所以不能实例化一个接口,只能实例化一个派生自该接口的对象。
接口可以定义方法,属性,索引。所以,对比一个类,接口特殊性:当定义一个类时,可以派生自多重接口,但是只能从仅有的一个类派生。
- C#事件(event)解析
- C#事件基于Windows消息处理机制,只是封装的更好,开发者无需知道底层消息处理机制,就可以开发出基于时间的程序。
- 事件编程好处:可以方便确定程序执行顺序。事件驱动程序等待事件时,不会占用很多资源(事件驱动程序等待消息到来)。事件简化了编程(操作系统将消息传递给对象,由对象的事件驱动程序确定事件处理方法)。
- 事件由两部分组成:事件发生器和事件接收处理类。
- 捕捉键盘按键程序:派生一个EventArgs类保存键盘按键信息。
internal class KeyEventArgs:EventArgs
{
????private char keyChar;
????public KeyEventArgs(char keyChar):base()
????{
????????this.keyChar = keyChar;
}
public char keyChar
{
????get {return keyChar;}
}
}
创建事件发生类KeyInputMonitor,用于监控键盘的输入并触发一个事件。
internal class KeyInputMonitor
{
????public delegate void KeyDownHandler(object sender,KeyEventArgs e);
????public event KeyDownHandler KeyDown;
????public void Run()
????{
????????bool finished = false;
????????do{
????????????Console.WriteLine("Input a char…");
????????????string response = Console.ReadLine();
????????????char responseChar = (response=="")?‘‘:char.ToUpper(response[0]);
????????????switch(responseChar)
????????????{
????????????????case ‘X‘: finished = true;break;
????????????????default:
????????????????????KeyEventArgs keyEventArgs = new KeyEventArgs(responseChar);
????????????????????KeyDown(this,keyEventArgs);
????????????????break;
}while(!finished);
}
}
}
创建事件接收方的类,这个类产生一个委托实例,再把委托实例添加到产生事件对象的事件列表中去,这个过程叫做订阅事件。
internal class EventReceiver
{
????public EventReceiver(KeyInputMonitor monitor)
????{
????????monitor.KeyDown +=new KeyInputMonitor.KeyDownHandler(this.OnkeyDown);
}
private void OnKeyDown(object sender,KeyEventArgs e)
{
????Console.WriteLine("Capture key:{0}",e.KeyChar);
}
}
调用:
public class MainEntryPoint
{
????public static void Start()
????{
????????KeyInputMonitor monitor = new KeyInputMonitor();
????????EventReceiver eventReceiver = new EventReceiver(monitor);
????????monitor.Run();
}
}
E. 总结:(C#中使用事件需要步骤)
????创建一个委托
????将委托与特定事件关联,
????编写事件处理程序
????利用编写的事件处理程序生成一个委托实例
????把这个委托实例添加到产生事件对象的事件列表中去,这个过程叫订阅事件。
????(C#中事件产生和实现流程)
????定义A为产生事件的实例,a为A产生的一个事件。
????定义B为接收事件的实例,b为处理事件的方法。
????A由于用户或者用户产生一个a事件。
????A通过事件列表中的委托对象将这个事件通知给B
????B接受到一个时间通知,
????调用B.b方法完成事件处理
????public class A
????{
public delegate void EventHandler(object sender)‘
public event EventHandler a;
public void Run()
{
Console.WriteLine("Trigger an event");
a(this);
}
}
class B
{
public B(A a)
{
a.a+=A.EventHandler(this.b);
}
private void b(object sender)
{
Console.WriteLine("Received an handled an event");
Console.Read();
}
}