C#之—委托
(1)定义委托:(百度百科样例,只有写了才有收获)
namespace Entrust
{
public delegate void GreetingDelegate(string name); //定义委托
class Class1
{
public void EnglishGreeting(string name)
{
Console.WriteLine("Good Morning." + name);
} public void ChineseGreeting(string name)
{
Console.WriteLine("早上好." +name);
} public void GreetPeople(string name, GreetingDelegate MakeGreeting)
{
MakeGreeting(name);
}
}
}
测试类:
namespace Entrust
{
class TestMain
{
static void Main(string[] args)
{
Class1 c = new Class1(); //c.GreetPeople("San Zhang",c.EnglishGreeting);
//c.GreetPeople("张三", c.ChineseGreeting); //Console.WriteLine("委托变量!");
//GreetingDelegate delegate1 = c.EnglishGreeting;
//GreetingDelegate delegate2 = c.ChineseGreeting;
//c.GreetPeople("张三", delegate2);
//c.GreetPeople("San Zhang", delegate1); //Console.WriteLine("多个方法绑定同一个委托!");
//GreetingDelegate delegate1;
//delegate1 = c.EnglishGreeting;
//delegate1 += c.ChineseGreeting;
//c.GreetPeople("李四",delegate1); //Console.WriteLine("直接调用委托!");
//GreetingDelegate delegate1;
//delegate1 = c.EnglishGreeting;
//delegate1 += c.ChineseGreeting;
//delegate1("小张"); //GreetingDelegate delegate1 = new GreetingDelegate(c.EnglishGreeting);
//delegate1 += c.ChineseGreeting;
//delegate1("小李"); GreetingDelegate delegate1 = c.EnglishGreeting;
delegate1 += c.ChineseGreeting; //绑定委托
delegate1 -= c.EnglishGreeting; //解除委托
delegate1("小张");
}
}
}
(2)定义委托事件(封装属性和方法)
namespace Entrust
{
public delegate void GreetingDelegate1(string name); class GreetingManage
{
public event GreetingDelegate1 MakeGreet;//这里声明一个事件 public GreetingDelegate1 delegate1;
public void GreetPeople(string name)
{
//if (delegate1 != null)
// delegate1(name);
MakeGreet(name);
}
}
}
执行的方法类
namespace Entrust
{
class GreetingLanguage
{
public void EnglishGreeting(string name)
{
Console.WriteLine("Morning, " + name);
} public void ChineseGreeting(string name)
{
Console.WriteLine("早上好, " + name);
}
}
}
测试类:
namespace Entrust
{
class TestMain
{
static void Main(string[] args)
{
GreetingLanguage gl = new GreetingLanguage();
GreetingManage gm = new GreetingManage();
//gm.delegate1 = gl.EnglishGreeting;
gm.MakeGreet += gl.ChineseGreeting;
gm.GreetPeople("小张");
Console.ReadKey();
}
}
}
(3)委托弥补观察者模式的不足(若观察者不存在)详见(设计模式之—观察者模式)
通知者接口类(Subject)
namespace Observer_Pattern.CLASS
{
interface Subject
{
void Notify(); //通知
string SubjectState
{
get;
set;
}
}
}
秘书类(secreter)实现通知者接口
namespace Observer_Pattern.CLASS
{
public delegate void EventHandler(); //声明一个委托
class Secretary:Subject
{
public event EventHandler Update; //声明一事件Update,类型为委托EventHandler
private string action; /// <summary>
/// 通知
/// </summary>
public void Notify()
{
Update();
} public string SubjectState
{
get { return action; }
set { action = value; }
}
}
}
炒股工作者(stockWorker)
namespace Observer_Pattern.CLASS
{
class StockObserver
{
private string name;
private Subject sub;
public StockObserver(string name, Subject sub)
{
this.name = name;
this.sub = sub;
}
public void StockUpdate()
{
Console.WriteLine("{0} ,{1} 关闭股票软件,继续工作!",sub.SubjectState,name);
}
}
}
看NBA工作者(NBAWorker)
namespace Observer_Pattern.CLASS
{
class NBAObserver
{
private string name;
private Subject sub;
public NBAObserver(string name, Subject sub)
{
this.name = name;
this.sub = sub;
} public void NBAUpdate()
{
Console.WriteLine("{0} ,{1} 关闭NBA视频,继续工作!",sub.SubjectState,name);
}
}
}
测试类(TestMain)
namespace ObserverPattern_Entrust_
{
class TestMain
{
static void Main(string[] args)
{
Secretary mishu = new Secretary();
StockObserver worker1 = new StockObserver("小张", mishu);
NBAObserver worker2 = new NBAObserver("小李", mishu); mishu.Update += worker1.StockUpdate; //绑定委托
mishu.Update += worker2.NBAUpdate; //绑定委托 mishu.SubjectState = "老板回来了";
mishu.Notify(); //调用委托 Console.ReadLine();
}
}
}
测试结果:

C#之—委托的更多相关文章
- HTML 事件(三) 事件流与事件委托
本篇主要介绍HTML DOM中的事件流和事件委托. 其他事件文章 1. HTML 事件(一) 事件的介绍 2. HTML 事件(二) 事件的注册与注销 3. HTML 事件(三) 事件流与事件委托 4 ...
- C#基础篇 - 理解委托和事件
1.委托 委托类似于C++中的函数指针(一个指向内存位置的指针).委托是C#中类型安全的,可以订阅一个或多个具有相同签名方法的函数指针.简单理解,委托是一种可以把函数当做参数传递的类型.很多情况下,某 ...
- [.NET] C# 知识回顾 - 委托 delegate (续)
C# 知识回顾 - 委托 delegate (续) [博主]反骨仔 [原文]http://www.cnblogs.com/liqingwen/p/6046171.html 序 上篇<C# 知识回 ...
- [C#] C# 知识回顾 - 委托 delegate
C# 知识回顾 - 委托 delegate [博主]反骨仔 [原文]http://www.cnblogs.com/liqingwen/p/6031892.html 目录 What's 委托 委托的属性 ...
- 9、委托、事件、Lambda
开始 关于委托,肯定是要有问题的. 第一个问题,委托用来干什么? 看.net中的表述:在.net平台下,委托类型用来定义和相应应用程序中的回调.(回调?处理内存中两个实体双向通信的一种技术.) 第 ...
- iOS 委托与文本输入(内容根据iOS编程编写)
文本框(UITextField) 本章节继续编辑 JXHypnoNerd .文件地址 . 首先我们继续编辑 JXHypnosisViewController.m 修改 loadView 方法,向 ...
- C#委托异步调用
参考页面: http://www.yuanjiaocheng.net/webapi/mvc-consume-webapi-get.html http://www.yuanjiaocheng.net/w ...
- JavaScript事件代理和委托(Delegation)
JavaScript事件代理 首先介绍一下JavaScript的事件代理.事件代理在JS世界中一个非常有用也很有趣的功能.当我们需要对很多元素添加事件的时候,可以通过将事件添加到它们的父节点而将事件委 ...
- .NET面试题系列[7] - 委托与事件
委托和事件 委托在C#中具有无比重要的地位. C#中的委托可以说俯拾即是,从LINQ中的lambda表达式到(包括但不限于)winform,wpf中的各种事件都有着委托的身影.C#中如果没有了事件,那 ...
- .NET基础拾遗(4)委托、事件、反射与特性
Index : (1)类型语法.内存管理和垃圾回收基础 (2)面向对象的实现和异常的处理基础 (3)字符串.集合与流 (4)委托.事件.反射与特性 (5)多线程开发基础 (6)ADO.NET与数据库开 ...
随机推荐
- OC面向对象的三大特征
OC面向对象的三大特征 1.OC面向对象的三大特封装 1)封装:完整的说是成员变量的封装. 2)在成语方法里面的成员变量最好不要使用@public这样会直接暴露在外面被别人随随便便修改,封装的方法还可 ...
- 怎么屏蔽F5键刷新功能
window.document.onkeydown=function(){if(event.keyCode==116){//屏蔽F5键,改为只刷新本页面,防止一刷就刷整个窗口event.keyCode ...
- js singleton
方案一:利用闭包的两个作用,可以变通地读到内部的变量. 方案二: 是可以让这些变量始终在内存中. 方案一 var SingletonTester = (function () { //单例方法 fun ...
- LA 3521 Joseph's Problem
题意:给你正整数n和k,然后计算从i到n k%i的和: 思路:如果n小于1000000,直接暴力计算,然后大于1000000的情况,然后在讨论n和k的大小,根据k%i的情况,你会发现规律,是多个等差数 ...
- 1.AJAX简介
没有AJAX会怎么样?普通的ASP.Net每次执行服务端方法的时候都要刷新当前页面,比如实现显示服务器时间.每次都要刷新页面的坏处:页面刷新打断用户操作.速度慢.增加服务器的流量压力.如果没有AJAX ...
- javascript(js)中的substring和substr方法
1. substring 方法 定义和用法: substring 方法用于提取字符串中介于两个指定下标之间的字符. 语法: stringObject.substring(start,end) 参数 ...
- Apache Struts 多个开放重定向漏洞(CVE-2013-2248)
漏洞版本: Struts < 2.3.15.1 漏洞描述: BUGTRAQ ID: 61196 CVE(CAN) ID: CVE-2013-2248 Struts2 是第二代基于Model-Vi ...
- hdu-4638-Group(树状数组)
题意 找到区间里有多少组连续数字串 分析: (转)思路:显然,我们要使得value最大,就要尽量将连续的ID分在一组,所以问题转化为求一个区间中连续ID区间的个数.我们从左往右扫描,依次考虑右端点为i ...
- FusionCharts(v3.6.0)使用(1)
前段时间做一个统计系统,需要画各种图表,于是找到了FusionCharts这个插件,功能甚是强大.在这个闲暇的春日午后,将这个插件的快速使用的方法写下来,方便懒得去官网看英文的朋友参考 安装 Fusi ...
- [置顶] ruby变量详解(收集+整理)
ruby的变量有局部变量,全局变量,实例变量,类变量,常量. 1.局部变量 局部变量以一个小写字母开头或下划线开头 局部变量有局部作用域限制(比如一个block内),它的作用域起始于声明处,结束于该声 ...