黑马程序员技术交流社区
标题: 如何正确的理解委托和委托链,以及委托和指针的区别 [打印本页]
作者: 该死的温柔 时间: 2014-5-17 18:08
标题: 如何正确的理解委托和委托链,以及委托和指针的区别
本帖最后由 该死的温柔 于 2014-5-17 21:21 编辑
求用最简单明了的话解释下,能拿出例子更好,,拜托各位精英了!!!
作者: 赵洋洋 时间: 2014-5-17 18:23
委托我理解的是,,,,让别人去给自己办事?比如说有一个类A,我是类B,当我要用到A中一个方法时,NEW一个A的小对象,就相当于委托A去帮我完成了工作
作者: 该死的温柔 时间: 2014-5-17 18:37
概念我知道,能拿出具体的代码吗?具体的使用
作者: 赵洋洋 时间: 2014-5-17 18:38
你等会儿,,我给你找找
作者: 赵洋洋 时间: 2014-5-17 18:41
- protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
- //设置输出内容类型
- response.setContentType("text/html;charset=utf-8");
- //获取out输出对象
- PrintWriter out = response.getWriter();
- //获取session对象
- HttpSession session = request.getSession();
- //组合
- UserService userService = new UserServiceImpl();
-
- request.setCharacterEncoding("utf-8");
- String username = request.getParameter("username");
- String password = request.getParameter("password");
-
- if(!"".equals(username) &&!"".equals(password)){
-
- //委托
- User user = userService.login(username, password);
-
- if(user != null){
-
- //记录session属性
- session.setAttribute("user", user);
- //跳到主页
- //response.sendRedirect("index.jsp");
- //跳到主页的Servlet
- //response.sendRedirect("IndexServlet");
-
- //跳到主页的Servlet,只显示第一页数据
- response.sendRedirect("IndexServlet?currentPage=1");
-
- }
- }
- }
- }
复制代码
作者: 方杰斌 时间: 2014-5-17 20:08
1.委托
委托是一种类型,是方法的类型,委托定义了方法的类型;这样就能把方法作为参数进行传递。
2.委托链
将多个方法捆绑到同一个委托对象上,形成委托链,当调用这个委托对象时,将依次调用委托链中的方法。
【区别很明显了吧】
-----------委托
代码
Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/-->namespace First
{
//定义委托,它定义了可以代表方法的类型
public delegate void GreetingDelegate(string name);
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void GreetPeople(string name, GreetingDelegate MakeGreeting)
{
MakeGreeting(name); //此句的意思是将name传递给方法MakeGreeting
}
private void Form1_Load(object sender, EventArgs e)
{
//将方法EnglishGreeting作为一个参数传递
//对应到GreetPeople中,是将"KIMI"传递给了EnglishGreeting
GreetPeople("KIMI", EnglishGreeting);
//将方法ChineseGreeting作为一个参数传递
//对应到GreetPeople中,是将"莱科宁"传递给了ChineseGreeting
GreetPeople("莱科宁", ChineseGreeting);
}
//此处函数的签名必须和委托GreetingDelegate(string name)一致
private void EnglishGreeting(string name)
{
MessageBox.Show("Morning, " + name);
}
private void ChineseGreeting(string name)
{
MessageBox.Show("早上好," + name);
}
}
}
===委托连
代码
//定义委托,它定义了可以代表方法的类型
public delegate void GreetingDelegate(string name);
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void GreetPeople(string name, GreetingDelegate MakeGreeting)
{
MakeGreeting(name); //此句的意思是将name传递给方法MakeGreeting
}
private void Form1_Load(object sender, EventArgs e)
{
//将方法EnglishGreeting作为一个参数传递
//对应到GreetPeople中,是将"KIMI"传递给了EnglishGreeting
//GreetPeople("KIMI", EnglishGreeting);
//将方法ChineseGreeting作为一个参数传递
//对应到GreetPeople中,是将"莱科宁"传递给了ChineseGreeting
//GreetPeople("莱科宁", ChineseGreeting);
GreetingDelegate delegate1 = new GreetingDelegate(EnglishGreeting);
//delegate1 = ChineseGreeting;
delegate1 += ChineseGreeting;
//delegate1 += EnglishGreeting;
delegate1("KIMI");
}
//此处函数的签名必须和委托GreetingDelegate(string name)一致
private void EnglishGreeting(string name)
{
MessageBox.Show("Morning, " + name);
}
private void ChineseGreeting(string name)
{
MessageBox.Show("早上好," + name);
}
}
===========委托和指针
C#中的委托类似于C或C++中的函数指针。使用委托使程序员可以将方法引用封装在委托对象内。然后可以将该委托对象传递给可调用所引用方法的代码,而不必在编译时知道将调用哪个方法。与C或C++中的函数指针不同,委托是面向对象,而且是类型安全的
函数指针就是指向函数入口的指针。虽然每个函数不是变量,但是在内存中,函数也占有相应的物理地址,函数指针就是指向该函数的入口地址的
作者: 该死的温柔 时间: 2014-5-17 21:20
明白了,谢了!!!!
作者: 嘴角上揚ぃ读不 时间: 2014-5-17 21:23
public class Class1
{
/// <summary>
/// 委托类型
/// </summary>
/// <param name="ismove">是否向下执行的标识</param>
public delegate void Print(ref string ismove);
/// <summary>
/// 委托实例
/// </summary>
Print p;
/// <summary>
///默认构造函数
/// </summary>
public Class1()
{
//添加四个方法
Print p = new Print(method1);//第一个方法用来实例化委托第一个实例
p += method2;
p += method3;
p += method4;
}
/// <summary>
/// 开始执行委托链
/// </summary>
/// <returns></returns>
public string run()
{
string ismove = "yes";
p(ref ismove);
return ismove;
}
public void method1(ref string ismove)
{
if (ismove == "yes")//判断是否要继续向下执行
{
}
}
public void method2(ref string ismove)
{
if (ismove == "yes")//判断是否要继续向下执行
{
//我这里执行出了问题,不想继续向下执行了
ismove = "no";//后面的所有方法都不会执行
}
}
public void method3(ref string ismove)
{
if (ismove == "yes")//判断是否要继续向下执行
{
}
}
public void method4(ref string ismove)
{
if (ismove == "yes")//判断是否要继续向下执行
{
}
}
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) |
黑马程序员IT技术论坛 X3.2 |