经过上一篇文章的复习,想来各位也已经初步了解了什么是委托以及委托的基础使用,那么今天我们即将进一步的对委托进行使用:
- 逻辑的插入执行:
如下,我有一个方法,里面有两个语句:
public void Test_One()
{
Debug.Log("第一句逻辑");
Debug.Log("第三句逻辑");
}
显而易见,这个方法中间少了 “第二句逻辑”,因为我把它写到了另一个方法里面,方法如下:
public void Test_Two()
{
Debug.Log("第二句逻辑");
}
所以我现在就想把“第二句逻辑”插入到“第一句”跟“第三句”中间执行,这时候肯定有人就会说很简单嘛,只需要把“Test_Two()”这个方法写入“Test_One()”方法中就行了,像下面这样:
public void Test_One()
{
Debug.Log("第一句逻辑");
Test_Two();
Debug.Log("第三句逻辑");
}
public void Test_Two()
{
Debug.Log("第二句逻辑");
}
没错,这样的确是可行的,但我这个时候改需求了,我不想插入“第二句”逻辑,我要插入其他的。
若这时候你问我:“你想要插入哪句嘛?告诉我,我直接把它写进去就行了。”
我这样回答你:“我目前还没考虑好,有可能会插入,也有可能不会插入,更有可能会插入不止一句!”
这时候你就不知道怎么办了,而委托就能够帮我们很好的解决问题,只要事先写好,我们以后想做什么都不用再去改变原有的方法“Test_One()”;
首先声明委托,再实例,传入,写好逻辑,具体写法如下:
public delegate void DelegateTest();
public void Test_One(DelegateTest delegateTest=null)
{
Debug.Log("第一句逻辑");
if (delegateTest != null)
{
delegateTest.Invoke();
}
Debug.Log("第三句逻辑");
}
这里我们直接让委托参数等于“null”,这样当我们不想插入逻辑的时候就可以不传参数。
之后我们测试一下,首先是不插入逻辑:
private void Start()
{
Test_One();
}
之后是插入逻辑:
private void Start()
{
//Test_One();
Test_One(Test_Two);
}
测试完毕,两个都没有问题,接下来我们再进一步。
- 委托的多播
先前说过,我可能会插入不止一句逻辑,即插入多个方法,那么一个委托参数可以代表多个相应方法吗?答案是当然可以,一个委托实例可以代表多个方法,这就是委托的多播:
如下,我们再写两个方法:
public void Test_Three()
{
Debug.Log("第四句逻辑");
}
public void Test_Four()
{
Debug.Log("第五句逻辑");
}
而后实例一个“DelegateTest()”:
public delegate void DelegateTest();
private void Start()
{
DelegateTest delegateTest;
}
那么如何让这个委托实例可以代表多个方法呢?也很简单,就是累加:
private void Start()
{
DelegateTest delegateTest;
delegateTest = Test_Two;
delegateTest += Test_Three;
delegateTest += Test_Four;
Test_One(delegateTest);
}
结果如图:
既然能够累加,自然也有减去:
private void Start()
{
DelegateTest delegateTest;
delegateTest = Test_Two;
delegateTest += Test_Three;
delegateTest += Test_Four;
delegateTest -= Test_Two;
delegateTest -= Test_Three;
delegateTest -= Test_Four;
Test_One(delegateTest);
}
测试结果:
好了,今天就到这,最后附上完整脚本:
using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System.IO;
using LitJson;
public class Test : MonoBehaviour
{
public delegate void DelegateTest();
private void Start()
{
DelegateTest delegateTest;
delegateTest = Test_Two;
delegateTest += Test_Three;
delegateTest += Test_Four;
delegateTest -= Test_Two;
delegateTest -= Test_Three;
delegateTest -= Test_Four;
Test_One(delegateTest);
}
public void Test_One(DelegateTest delegateTest=null)
{
Debug.Log("第一句逻辑");
if (delegateTest != null)
{
delegateTest.Invoke();
}
Debug.Log("第三句逻辑");
}
public void Test_Two()
{
Debug.Log("第二句逻辑");
}
public void Test_Three()
{
Debug.Log("第四句逻辑");
}
public void Test_Four()
{
Debug.Log("第五句逻辑");
}
}
最后的最后,只想说一句:“委托很简单,如果你想成为一名C#程序员,却连委托也不愿意用心去弄懂,那我觉得你可以转行了,不是说你不适合写C#,而是你不适合做一个程序员。”