`

事件委托(delegate)

 
阅读更多
委托机制的本质就是调用成员函数的函数指针,实现回调

委托就是一种引用方法的类型.一旦为委托分配了方法,委托将与该方法具有完全相同的行为.委托方法的使用可以像其他任何方法一样,具有参数和返回值.委托可以看作是对函数的抽象,是函数的"类".委托的实例将代表一个具体的函数.

一个委托可以搭载多个方法,所有方法被依次唤起.它可以使得委托对象所搭载的方法并不需要属于同一个类.但委托对象所搭载的所有方法必须具有相同的原形和形式.

https://blog.csdn.net/xgx198831/article/details/47171539

#include <iostream>
#include <vector>
using namespace std;

class A{
public:
    void fun(){
        cout << "fun" << endl;
    }
};

class B{
public:
    void fun(int i){
        cout << "B::fun " << i << endl;
    }
};

class C{
public:
    void fun(int i){
        cout << "C::fun " << i << endl;
    }
};

void fun2(int i){
    cout << "fun2:" << i << endl;
}

template<typename T>
class DelegateHandler
{

public:
    DelegateHandler(T* pT, void (T::*pFun)()):
          mT(pT), mFun(pFun) { }

    void invoke()
    {
        (mT->*mFun)();
    }

private:
    T* mT;
    void (T::*mFun)();
};

//none member fun
template<>
class DelegateHandler<void>
{
public:
    DelegateHandler(void (*pFun)(int))
    {
        mFun = pFun;
    }
    void invoke(int i)
    {
        mFun(i);
    }

private:
    void (*mFun)(int);
};

class DelegateHandlerInterface
 {
public:
    virtual ~DelegateHandlerInterface(){ }
    virtual void invoke(int i) = 0;
};

template<typename T>
class DelegateHandlerImpl1: public DelegateHandlerInterface
 {
public:
    DelegateHandlerImpl1(T* pT, void (T::*pFun)(int)):
          mT(pT), mFun(pFun) { }
    virtual void invoke(int i){
        (mT->*mFun)(i);
    }
private:
    T* mT;
    void (T::*mFun)(int);
};

int main()
{
    A a;
    DelegateHandler<A> af(&a,&A::fun);
    af.invoke();
    DelegateHandler<void> vf(&fun2);
    vf.invoke(3);

    B b;
    C c;
    vector<DelegateHandlerInterface*> v;
    DelegateHandlerImpl1<B> impl1(&b,&B::fun);
    DelegateHandlerImpl1<C> impl2(&c,&C::fun);
    v.push_back(&impl1);
    v.push_back(&impl2);
    for (auto it = v.cbegin(); it != v.cend(); ++it) {
        (*it)->invoke(7);
    }
}



fun
fun2:3
B::fun 7
C::fun 7


分享到:
评论

相关推荐

    事件委托 event delegate

    在编程领域,事件委托(Event Delegate)是一种设计模式,它允许我们把事件处理代码与触发事件的对象解耦。这种模式在.NET框架中尤其常见,它为面向对象编程提供了灵活的事件处理机制。在这个例子中,我们将关注如何...

    VB.Net-C#多线程Thread-代理委托delegate编程

    最近收集的VB.Net-C#多线程Thread-代理委托delegate编程。文章列表: c#.net多线程同步.txt C#WebBrowser页面与WinForm交互技巧一.txt C#多线程编程-多细全.txt C#多线程编程简单实例.txt C#多线程窗体控件安全访问....

    委托delegate invoke的简单源代码,适合委托初学者!

    委托在.NET框架中扮演着非常重要的角色,它是类型安全的函数指针,允许我们传递方法作为参数,或者将多个方法连接在一起形成一个事件处理链。本文将深入探讨委托的使用,特别是`Delegate`的`Invoke`方法,以及如何在...

    delegate委托

    从序言中,大家应该对委托和事件的重要性有点了解了吧,虽然说我们现在还是能模糊,但是从我的大白话系列中,我会把这些概念说的通俗易懂的。首先,我们还是先说说委托吧,从字面上理解,只要是中国人应该都知道这个...

    C#由浅至深深度解析Delegate委托与Event事件

    ### C#中的Delegate委托与Event事件深度解析 #### 引言 在.NET Framework中,委托(Delegate)和事件(Event)是非常重要的概念。对于初学者而言,这些概念可能较为抽象和难以理解。本文旨在通过一系列逐步深入的...

    C#中的事件和委托(Delegate,Event)

    在C#编程语言中,事件和委托是两个关键概念,它们是实现对象间通信和响应机制的核心工具。本文将深入探讨这两个概念,并提供详细的解释。 首先,我们要理解什么是委托(Delegate)。委托在C#中是一种类型,它代表了...

    .Net的异步机制(委托Delegate)

    在这个机制中,委托(Delegate)扮演了关键角色,它充当了方法的引用,使得可以在不同的线程上调用这些方法。 在C#中,委托是一种类型安全的事件处理机制,它可以被看作是指向方法的指针。在异步编程中,委托允许...

    c#中关于委托delegate的经典的实例

    在C#编程语言中,委托(Delegate)是一个强大的特性,它允许我们将方法作为参数传递给其他方法,或者存储和调用方法的集合。这个特性在事件处理、回调函数以及实现函数式编程风格时非常有用。在本文中,我们将深入...

    C#使用委托(delegate)实现在两个form之间传递数据的方法

    在C#编程中,委托(Delegate)是一种类型安全的函数指针,允许我们将方法作为参数传递给其他方法,或者存储在变量中以便稍后调用。这种机制在处理事件处理和跨对象通信时非常有用,特别是在需要在多个Form之间传递...

    C++中实现委托(delegate)

    网上有很多关于C++ delegate机制的文章,但都讲的是函数指针的内容,上周就C++中实现C#的delegate机制的问题研究了好几天,查看了很多相关资料,才解决了问题,现将我写的C++ delegate测试程序贴出来,希望能帮到有...

    02.C# 知识回顾 - 委托 delegate续.pdf

    C#中的委托(delegate)是一种引用类型,用于封装对具有特定参数列表和返回类型的方法的引用。委托是多态的,这意味着可以引用多种类型的方法,只要这些方法与委托定义的签名相匹配。通过委托,我们可以在运行时动态...

    对C#委托及事件委托的理解

    C#中的委托是面向对象编程的一种强大特性,它允许我们将方法作为参数传递给其他方法,或者将多个方法链接在一起形成一个事件处理链。本文将深入探讨C#中的委托和事件委托的概念、用途以及它们的工作原理。 1. **...

    iOS设计模式——委托(delegate)例子

    通过实现委托,一个对象(委托者)可以通知或询问另一个对象(委托对象)来执行特定任务或响应特定事件。 委托模式的核心思想是定义一个协议,这个协议包含了委托对象需要实现的方法。这些方法通常是委托者触发的...

    CSharp_Delegate C#委托

    C#委托是.NET框架中的一种强大的特性,它允许我们封装方法作为...熟练掌握委托的声明、实例化、调用以及与事件的结合,能极大地提高开发效率和代码质量。在实际开发中,合理利用委托可以构建出优雅、可扩展的解决方案。

    c#多线程利用委托更新控件内容

    例如,在串口接收事件中,可以使用委托(delegate)来更新控件内容: `SetText(ASCIIEncoding.ASCII.GetString(arr));` 在上面的代码中,`arr` 是 byte[] 类型的数据,用于传递给控件内容更新方法。 使用委托...

    01.C# 知识回顾 - 委托 delegate.pdf

    委托提供了一种方便的方式来实现事件处理和回调函数机制,广泛应用于面向对象的程序设计中。 委托的声明类似于普通方法的声明,但它们仅仅是对符合特定签名的方法的引用。声明委托时,不需要提供方法的具体实现,只...

    QT中QTableView加载自定义Modle和自定义委托Delegate

    QT自定义模型Modle的实现实例和自定义委托Delegate的实现实例以及在QTableView中加载使用的实现

    多线程,Delegate 委托带参数的方法

    在.NET框架中,Delegate是类型安全的事件处理和回调机制的核心。它允许我们将方法作为参数传递,这在多线程编程中尤其有用,因为它提供了一种在不同线程间通信的方式。本文将深入探讨“多线程”、“Delegate委托”...

Global site tag (gtag.js) - Google Analytics