多播委托
1、 委托可以同时进行一串动作,使用+=运算符。
2、例子:
using System;
class A
{
static void read(string s)
{
Console.WriteLine("读" + s);
}
static void say(string s)
{
Console.WriteLine("说" + s);
}
delegate void D(string s); //定义委托类
static void main()
{
D d = read; //实例化D类对象d,代替read函数
d += say; //增加d的动作
d -= read; //减少d的动作
d("三国");
}
}
3、多播委托的初始化
D d ;
d = read;
d += read; //程序将执行两次
匿名委托
1、匿名委托:定义一个委托,当为委托赋值时,直接定义方法体,而不是让其代替其他函数。
2、例子:
using System;
class A
{
delegate void D(string s);
static void main()
{
D d = delegate(string s) //使用delegate关键字定义了d的方法体
{
Console.WriteLine(s);
};
d("这是匿名委托");
}
}
委托耦合
1、面向对象高聚合、低耦
合:类的内部封装密切相关的成员,而类与类之间的关联度越小越好。
2、实例:一个名为人的基类,有性别、姓名等信息。其派生类分为三类:病人、医生和护士。病人有自己的成员是生病,医生的成员是治病,护士的成员是打针。当医生生病的时候,会变成病人;病人生病久了变成医生。这时候类之间的转换会很混乱,是因为继承的原因。
3、解决方法:使用委托实现对象之间的松散耦合
在医生和病人之间定义一个委托,让其指向病人类中的方法生病,这个时候医生就拥有了病人的特性。
using System;
delegate void D(string s);
class A
{
static void Main()
{
Doctor doctor = new Doctor();
Patient patient = new Patient();
doctor.d = patient.ill();
doctor.prescribe("九华玉露膏");
doctor.d("神经病");
Console.Read();
}
}
class Doctor
{
public D d;
public void prescribe(string s)
{
Console.WriteLine("医生开药" +s);
}
}
Class Patient
{
public void ill(string s)
{
Console.WriteLine("患病" +s);
}
}
事件
1、事件:事件就相当于Qt中的信号(Signals),当给出信号的时候,两个对象之间的方法产生联系。有一个对象的事件触发另一个对象的事件。例如:老师说下课吃饭的信号和学生吃饭。
2、事件定义,订阅,触发
using System;
delegate void D(); //定义委托类
class A
{
static void Main()
{
Car car = new Car();
car.run_red += Police.Write_a_ticket; //警察订阅了对象的car的闯红灯事件
car.run();
Console.Read();
}
}
Class Car
{
public event D run_red; //定义了事件
public void run()
{
Console.WriteLine("行进中...");
if(run_red != null)
{
run_red(); //触发了事件
}
}
}
class Police
{
public static void write_a_ticket()
{
Console.WriteLine("开罚单"); //
}
}