详谈Delegate (一)

UE4的delegate  首先,UE4中的delegate和C#里边是一样的,delegate的本质是一个特殊类的对象,它可以储存(一个或多个)函数指针和payload数据(就是除了函数指针,还能存些你调用时候的额外参数)UE4中的delegate类名字中都有signature,这里我们以overlap的回调委托为例:在各种mesh components中,都有这么一个字段 FComponentBeginOver 阅读详情

 表示委托,委托是一种数据结构,它引用静态方法或引用类实例及该类的实例方法。

[SerializableAttribute] 
[ClassInterfaceAttribute(ClassInterfaceType.AutoDual)] 
[ComVisibleAttribute(true)] 
public abstract class Delegate : ICloneable, ISerializable

Delegate 类是委托类型的基类。然而,只有系统和编译器可以显式地从 Delegate 类或MulticastDelegate 类派生。此外,还不允许从委托类型派生新类型。Delegate 类不是委托类型,该类用于派生委托类型。

大多数语言实现 delegate 关键字,这些语言的编译器能够从 MulticastDelegate 类进行派生;所以,用户应当使用语言所提供的delegate 关键字。

委托类型的声明建立了一个协定,该协定指定一个或多个方法的签名。委托是具有对以下内容的引用的委托类型的实例:

  • 某种类型的实例方法和可分配给该类型的目标对象。

  • 某种类型的实例方法(包含在形参表中公开的隐藏 this 参数)。该委托称为开放式实例委托。

  • 静态方法。

  • 静态方法和可分配给该方法的第一个参数的目标对象。该委托称为通过其第一个参数关闭。

当委托表示通过其第一个参数关闭的实例方法(最常见的情况)时,委托存储对该方法的入口点的引用和对称为目标的对象(该对象具有可分配给定义该方法的类型的类型)的引用。当委托表示开放式实例方法时,它存储对该方法入口点的引用。委托签名必须在其形参表中包括隐藏的this 参数;在这种情况下,委托不具有对目标对象的引用,必须在调用委托时提供目标对象。

当委托表示静态方法时,委托存储对该方法入口点的引用。当委托表示通过其第一个参数关闭的静态方法时,委托存储对该方法入口点的引用和对目标对象(该对象可分配给方法第一个参数的类型)的引用。调用该委托时,静态方法的第一个参数接收目标对象。

委托的调用列表就是已排序的委托集,其中列表的每个元素恰好调用该委托表示的一个方法。调用列表可以包含重复的方法。在调用期间,按方法出现在调用列表中的顺序来调用它们。委托试图调用其调用列表中的每个方法,而重复方法在调用列表中出现一次就调用一次。委托是不可变的;一旦创建,委托的调用列表便无法更改。

委托被称作多路广播委托或可组合委托,因为委托可以调用一种或多种方法,并且可以用在组合操作中。

合并操作(如 Combine 和 Remove)并不改变现有委托。相反,这样的操作返回一个新委托,其中包含操作结果、未更改的委托或 空引用(在 Visual Basic 中为 Nothing)。当合并操作的结果是没有引用任何方法的委托时,该操作返回 空引用(在 Visual Basic 中为 Nothing)。当所请求的操作无效时,合并操作返回未更改的委托。

如果所调用的方法引发异常,则方法停止执行,并将异常向回传递给委托的调用方,且不再调用调用列表中其余的方法。捕捉调用方的异常并不改变此行为。

当委托所调用的方法的签名包含返回值时,委托返回调用列表中最后一个元素的返回值。当签名包含由引用传递的参数时,该参数的最终值就是调用列表中每个方法的结果,这些方法依序执行并更新参数的值。

编译器为委托提供两种其他方法:BeginInvoke 和 EndInvoke。有关这些方法的更多信息,请参见“使用异步方式调用同步方法”。

在 C 或 C++ 中与委托最为相似的是函数指针。委托可以表示静态方法或实例方法。当委托表示实例方法时,委托不仅存储对方法入口点的引用,还存储对类实例的引用。与函数指针不同,委托是面向对象和类型安全的。

using System;
public class SamplesDelegate  {

   // Declares a delegate for a method that takes in an int and returns a String.
   public delegate String myMethodDelegate( int myInt );

   // Defines some methods to which the delegate can point.
   public class mySampleClass  {

      // Defines an instance method.
      public String myStringMethod ( int myInt )  {
         if ( myInt > 0 )
            return( "positive" );
         if ( myInt < 0 )
            return( "negative" );
         return ( "zero" );
      }

      // Defines a static method.
      public static String mySignMethod ( int myInt )  {
         if ( myInt > 0 )
            return( "+" );
         if ( myInt < 0 )
            return( "-" );
         return ( "" );
      }
   }

   public static void Main()  {

      // Creates one delegate for each method.
      mySampleClass mySC = new mySampleClass();
      myMethodDelegate myD1 = new myMethodDelegate( mySC.myStringMethod );
      myMethodDelegate myD2 = new myMethodDelegate( mySampleClass.mySignMethod );

      // Invokes the delegates.
      Console.WriteLine( "{0} is {1}; use the sign \"{2}\".", 5, myD1( 5 ), myD2( 5 ) );
      Console.WriteLine( "{0} is {1}; use the sign \"{2}\".", -3, myD1( -3 ), myD2( -3 ) );
      Console.WriteLine( "{0} is {1}; use the sign \"{2}\".", 0, myD1( 0 ), myD2( 0 ) );
   }

}


 


 

UE4里的Delegate Delegate的本质是回调,是观察者模式的应用。 A里产生变化需要与A1,A2,A3有交互。有3种方式: 方式1:A里调用A1, A2,A3的方法。 方式2:A1, A2, A3里调用A的方法。 方式3:弄一个中间者,Event/Delegate,A不用知晓A1, A2,A3的存在,A1,A2,A3也不用知道A的存在(Event/Delegate可以不用放在A里,另外放在另一个类里也没问... 阅读详情

相关推荐

C# 委托(Delegate)一

一.Delegate的定义说明: 二.声明委托(Delegate): 三.实例化委托(Delegate):

weixin_53520014的博客 1222

【安卓架构】页面分层架构:Delegate模式

今天分享一下自己对页面业务逻辑分层的心得,在没有LifeCycle组件的时候,一直都是用自己总结的Delegate架构,即使出现LifeCycle组件之后,虽然有部分思想重叠,但是Delegate架构加入了更多的生命周期代理和代理事件。 分析: 在APP开发中,一个复杂一点的页面业务逻辑一般都不会少于1000行,想起来如果把这1000行代码写到一个Activity中,那后期各...

weixin_30394669的博客 1265

UE4之Delegate:动态单播

定义 #define FUNC_CONCAT( ... ) __VA_ARGS__ #define DECLARE_DYNAMIC_DELEGATE( DelegateName ) BODY_MACRO_COMBINE(CURRENT_FILE_ID,_,__LINE__,_DELEGATE) FUNC_DECLARE_DYNAMIC_DELEGATE( FWeakObjectPtr, Dele...

Mccree的博客专栏 1258

【Android】浅析 Kotlin 委托

在本文中,我们简要的分析了 Kotlin 委托的原理、用法以及一些高级技巧。Kotlin 委托是一种非常有用的机制,可以帮助我们减少重复代码,将实现与接口分离,并实现一些复杂的功能。如果你还没有使用 Kotlin 委托,现在是时候开始了!原文作者:Quincy_Ye原文链接:https://juejin.cn/post/7226629911351132215如果想要成为架构师或想突破20~30K薪资范畴,那就不要局限在编码,业务,要会选型、扩展,提升编程思维。

Android 开发架构 590

Model/View模块中Delegate的扩展:持久Delegate(一)

注:以下内容需要熟悉Qt的Model/View模块,如尚未掌握该模块的基础知识,不建议阅读。 在处理大规模,结构化数据的时候,Qt的Model/View非常好用,但其界面形式较为单一,不太符合日益增长的审美需求。有时候,Model/View在处理数据时,虽然可以完成相应的功能,但界面处理上总好像差点意思。 在Model/View中,Delegate负责数据项item的显示和交互,我们可以...

qq_34305316的博客 3483

使用Activity和Delegate与适配器交互

在这个Demo里,我们会分析如何通过委托模式(Delegation Pattern)帮助开发者把所有的业务逻辑从适配器中移到Activity中。我们创建一个简单的应用程序,通过该应用程序可以向列表中添加电话号码,列表中每一行都有一个Remove按钮,用于删除电话号码。

delegates - 委托模式的简单实现

delegates 基本用法就是将内部对象的变量或者函数绑定在暴露在外层的变量上,直接通过 delegates 方法进行如下委托,基本的委托方式包含: getter:外部对象可以直接访问内部对象的值 setter:外部对象可以直接修改内部对象的值 access:包含 getter 与 setter 的功能 method:外部对象可以直接调用内部对象的函数 const delegates = r...

weixin_44378954的博客 425

android-controller-delegate-sample

android-controller-delegate-sample 使用图书馆

Android的Proxy/Delegate Application框架 (主要介绍插件化开发)

1. 插件化的原理 是 Java ClassLoader 的原理:Java ClassLoader基础   常用的其他解决方法还包括:Google Multidex,用 H5 代替部分逻辑,删无用代码,买付费版的 Proguard 当插件化作用包括:(1) 模块解耦,(2) 动态升级,(3) 高效并行开发(编译速度更快) (4) 按需加载,内存占用更低 (5) 节省升级流量   2. 插件...

weixin_34161029的博客 199

android-extras-delegates,kotlin属性委托管理android意图和bundle extra.zip

包含一个kotlin属性委托的集合,用于管理android意图和捆绑附加组件。

NXP KW45开发实战:如何在MCUXpresso IDE中正确配置J-Link并解决设备识别问题

本文详细介绍了在MCUXpresso IDE中配置J-Link以支持NXP KW45无线MCU开发的实战指南。从环境准备到J-Link深度配置,再到烧录流程优化和高级调试技巧,帮助开发者高效解决设备识别问题并提升开发效率。特别推荐使用JLinkRemoteServer.exe进行多设备并行调试,并提供了烧录速度优化和低功耗调试的实用技巧。

gray5的博客 864

Android 通用适配器,RecyclerView

修改AdapterDelegates开源项目 开源项目地址:https://github.com/sockeqwe/AdapterDelegates 发现该开源项目扩展性似乎有点差,里面没有可以扩展的接口。有点搞不下去了。于是有了重构的想法了,这种想法是不是太邪恶了? 该项目的设计原理是,每种类型的视图对应一种代理,对adapter起到很好的解耦效果。不管是代码管理还是视图结构都清晰明了。该...

chezi008 880

非华为电脑也能用上鸿蒙生态?手把手教你给Win10/Win11装上最新华为电脑管家(附移动应用引擎开启方法)

本文详细介绍了如何在非华为品牌的Windows 10/11电脑上安装华为电脑管家并启用移动应用引擎,实现鸿蒙生态的无缝协同体验。从BIOS设置到安装步骤,再到性能优化和常见问题解决,手把手教你解锁跨设备高效工作流。

weixin_42542669的博客 4252

一个C++ delegate的实现

更新说明:修改了借口,增加了对smart_ptr的支持。最近需要一个C++delegate的实现,比较接近C#的delegate的用法。翻遍了boost,虽然有相近的东西,但是,始终使用起来问题多多:function:的绑定方式倒也可以接受,成员函数调用的方式实在不爽。而且,同样的函数原型,native和member对应的function类型不同,不同class的相同原型的member funct

不亦快斋 1万+

ROST_CM6软件之词频分析、社会网络和语义网络分析、情感分析

简介 ROST CM 6是武汉大学沈阳教授研发编码的国内目前唯一的以辅助人文社会科学研究的大型免费社会计算平台。该软件可以实现微博分析、聊天分析、全网分析、网站分析、浏览分析、分词、词频统计、英文词频统计、流量分析、聚类分析等一系列文本分析。 社会网络和语义网络分析(S) 数据 注意,保存时编码要为ANSI 所以这里需要转换一下 准备自定义表与停词表 例如 同时,点击快速分析后,将会弹出网络图 对网络图进行设置 对布局进行设置 对节点、边进行设置 最终效果图 修改 情感分析

积一时之步,臻千里之遥程 9万+

基于STM32F407与AD9910/AD9959的高频可调DDS信号源设计与实战

本文详细介绍了基于STM32F407微控制器与AD9910/AD9959高性能DDS芯片的高频可调信号源设计与实现。文章从DDS原理入手,阐述了双芯片方案的优势,并重点分享了高频电路设计中的电源、PCB布局布线等关键硬件设计技巧与避坑指南。同时,提供了通过SPI配置DDS芯片及利用Matlab生成任意波形的软件驱动方法,旨在帮助开发者打造一个覆盖10Hz至4200MHz的实用信号发生器。

weixin_36184718的博客 122

[UE C++] Delegate使用详解

Delegate的使用方法总结终于告一段落,文章比较长,若有错误,欢迎指出。学疏才浅,还请见谅。

qq_52179126的博客 6820

3DE重客户端安装

3DE重客户端安装

m0_48170265的博客 9434

C++实现Delegate

大家都知道C#的Delegate非常的好用,特别是应用在Subject-Observer模式的时候,具有很好的灵活性,但是C++只有function pointers,前面有一篇blog讲到了它的问题,以及难以理解的地方。不过也提到boost使用模板实现了boost::function基本具备了delegate的特点,我稍加改造,去除了boost的依赖关系,实现了一个小巧的Delegate,不过鉴

1915

从混淆到清晰:实战解读LASSO回归图与交叉验证图(R glmnet二分类案例)

本文深入解析LASSO回归在R glmnet中的可视化应用,特别针对二分类问题。通过详细解读系数路径图和交叉验证误差图,帮助读者掌握变量筛选的关键技巧,并指导如何基于业务需求选择最优lambda值,实现从数据可视化到决策的完整流程。

weixin_32678995的博客 429

Qt c++ llama.cpp 运行 LLaMA-3-8B 中文对话机器人(多模态输入)

助手:

寒寒豆豆软件公司的博客 221

UE4 Delegate(代理)相关源码分析(一)

UE4 Delegate(代理)相关源码分析 前言 这是一篇关于UE4代理的一篇分析文章, 但部分涉及C++代理的实现, 请自行百度, 个人也不是很了解深入 这篇文章会使对UE4代理相关的认识更深刻, 然并卵. 核心函数 一堆代理的定义 正文 先说下代理的类型, Engine\Source\Runtime\Core\Public\Delegates\DelegateCombinatio...

孤傲鵰的博客 1303

在 SAP SD 模块里,销售订单号既可以由系统“自动”产生,也可以由用户“手工”输入,核心取决于“号码段(Number Range)”与“订单类型(Sales Document Type)”这两处配

SAP销售订单编号配置指南:系统提供内部自动编号和外部手工编号两种方式,通过VN01定义号码段(内部/外部),VOV8分配给订单类型并设置"ExtNo.Rq"选项即可切换。高阶应用支持灵活编号(如加前缀)或通过增强出口完全自定义编号规则。配置时需注意号码段创建、分配及传输问题,常见故障包括号码范围不存在或配置错误。核心是"号码段+订单类型"的组合控制编号生成方式,满足从简单到复杂的业务需求。

金牌架构师 531

QTreeWidget设置Delegate

1、QT分为:Mode层,View层,数据存放在Mode里面,显示在View层,当我们修改了View层的同时,需要修改Mode层。 2、Delegate工作原理:当我们点击支持编辑的列,创建自定义的编辑控件(可为button、spinbox、combobox等等),然后从Mode层,取值,设置给控件,当自定义控件,编辑完成,再设置给Mode层 3、自定义Delegate class Ite...

qq_15821883的博客 3974

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

【Groovy】闭包 Closure ( 闭包的 delegate 代理策略 | OWNER_FIRST | DELEGATE_FIRST | OWNER_ONLY | DELEGATE_ONLY )

一、闭包的代理策略引入、 二、闭包的四种代理策略

让 学习 成为一种 习惯 ( 韩曙亮 の 技术博客 ) 1918

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

delegate关键字与Delegate类型

今天写了一个例子,能说明delegate和Delegate的不同,帖在下面,注释很全: 1usingSystem; 2usingSystem.Collections.Generic; 3usingSystem.Text; 4usingSystem.Resources; 5usingSystem.Reflection; 6usingSys...

Zy0414的博客 509

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

上一篇: C#事件(event)解析
下一篇: 详谈Delegate (二)
雪岢奇
博客等级 码龄17年 310粉丝 60原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值