C# 委托(三) 模板方法 和 回调方法
模板方法:
using System; namespace 模板方法 { class Program { static void Main(string[] args) { 工厂 gc = new 工厂();//实例化一个 工厂 类 gc 包装 bz = new 包装();//实例化一个 包装 类 bz Func<产品> F1 = new Func<产品>(gc.制作披萨);//声明一个委托, 并初始化 Func<产品> F2 = new Func<产品>(gc.制作玩具汽车);//声明一个委托, 并初始化 箱子 b1 = bz.包装产品(F1);//调用 包装 类 里面的 包装产品 方法,并将接收返回值赋值给b1 PS:在这里会跳转到 包装产品() 这个方法。 箱子 b2 = bz.包装产品(F2);//调用 包装 类 里面的 包装产品 方法,并将接收返回值赋值给b2 PS:在这里会跳转到 包装产品() 这个方法。 Console.WriteLine(b1.产品.名字);//输出 Console.WriteLine(b2.产品.名字);//输出 Console.ReadKey();//按任意键 } } class 产品 //定义一个 产品 类 { public string 名字 { get; set; } //声明一个属性 } class 箱子 //定义一个 箱子 类 { public 产品 产品 { get; set; }//将产品 类作为属性 } class 包装 //定义一个 包装 类 { public 箱子 包装产品(Func<产品> get产品) // 方法,参数是一个 委托,委托的参数类型是一个 产品类。 返回值类型是 箱子 类型。 { 箱子 b = new 箱子();//实例化一个箱子类 b。 产品 c = get产品();//将传进来的委托变量执行结果赋值给 产品类 c PS:在这里 get产品() 会先跳转到,传进来的委托的对象,比如:gc.制作披萨 后将得到的值赋值给 c b.产品 = c;//将c赋值给 b 类中的 产品。 return b;//返回一个 箱子类的 b的值. } } class 工厂//定义一个工厂类 { public 产品 制作披萨()// 方法,返回值类型是 产品 类型。 { 产品 c = new 产品();//实例化一个 产品 类 c c.名字 = "披萨";//给这个产品命名。 return c;//返回一个 产品类的 c的值。 } public 产品 制作玩具汽车()// 方法,返回值类型是 产品 类型。 { 产品 w = new 产品();//实例化一个 产品 类 w w.名字 = "小汽车";//给这个产品命名。 return w;//返回一个 产品类的 w的值。 } } }
输出结果:
回调方法:
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace 回调方法 { class Program { static void Main(string[] args) { 工厂 gc = new 工厂();//实例化一个 工厂 类 gc 包装 bz = new 包装();//实例化一个 包装 类 bz Func<产品> F1 = new Func<产品>(gc.制作披萨);//声明一个委托, 并初始化 Func<产品> F2 = new Func<产品>(gc.制作玩具汽车);//声明一个委托, 并初始化 记录 jl = new 记录();//实例化一个 记录 类 jl Action<产品> A1 = new Action<产品>(jl.记);//声明一个委托,并初始化 箱子 b1 = bz.包装产品(F1, A1);//调用 包装 类 里面的 包装产品 方法,并将接收返回值赋值给b1 PS:在这里会跳转到 包装产品() 这个方法。 箱子 b2 = bz.包装产品(F2, A1);//调用 包装 类 里面的 包装产品 方法,并将接收返回值赋值给b2 PS:在这里会跳转到 包装产品() 这个方法。 Console.WriteLine(b1.产品.名字);//输出 Console.WriteLine(b2.产品.名字);//输出 Console.ReadKey();//按任意键 } } class 记录 //定义一个 记录 类 { public void 记(产品 c)//方法,参数类型是一个 产品 类 c。 { Console.WriteLine("产品名字:{0},生产时间:{1},产品价格:{2}.", c.名字, DateTime.UtcNow, c.价格);//输出 } } class 产品 //定义一个 产品 类 { public string 名字 { get; set; } //声明一个属性 public double 价格 { get; set; } //声明一个属性 } class 箱子 //定义一个 箱子 类 { public 产品 产品 { get; set; }//将产品 类作为属性 } class 包装 //定义一个 包装 类 { public 箱子 包装产品(Func<产品> get产品, Action<产品> get记录) // 方法,参数是 委托,委托的参数类型是 产品类 和 记录类。 返回值类型是 箱子 类型。 { 箱子 b = new 箱子();//实例化一个箱子类 b。 产品 c = get产品();//将传进来的委托变量执行结果赋值给 产品类 c PS:在这里 get产品() 会先跳转到,传进来的委托的对象,比如:gc.制作披萨 后将得到的值赋值给 c if (c.价格 > 10)//判断接收到的产品价格是否小于10元。 { get记录(c);//大于10 则调用委托 记录。 } b.产品 = c;//将c赋值给 b 类中的 产品。 return b;//返回一个 箱子类的 b的值. } } class 工厂//定义一个工厂类 { public 产品 制作披萨()// 方法,返回值类型是 产品 类型。 { 产品 c = new 产品();//实例化一个 产品 类 c c.名字 = "披萨";//给这个产品命名。 c.价格 = 8;//价格 return c;//返回一个 产品类的 c的值。 } public 产品 制作玩具汽车()// 方法,返回值类型是 产品 类型。 { 产品 w = new 产品();//实例化一个 产品 类 w w.名字 = "小汽车";//给这个产品命名。 w.价格 = 15;//价格 return w;//返回一个 产品类的 w的值。 } } }
输出结果: