using System.Collections;
using System;
using System.Collections.Generic;
using UnityEngine;
//委托的基本定义和使用
public class Delegate111 : MonoBehaviour
{
//1.定义无返回值无参数的委托类型
delegate void delegate_1();
//2.定义有返回值 返回值为string 无参数的委托
delegate string delegate_2();
//3.定义无返回值 有一个参数类型为int的参数 的委托类型
delegate void delegate_3(int a3);
//4.定义有一个返回值为int类型 两个参数为int string类型的 委托类型
delegate int delegate_4(int a4, string b4);
//5.委托值作为参数
//首先定义一个无返回值无参数的委托类型
delegate void delegate_5_1();
//定义一个无返回值 有两个参数分别是 int delegate类型的 委托类型
delegate void delegate_5_2(int b5, delegate_5_1 c5);
//6.定义一个有一个string类型的返回值 有两个参数分别是 string 类型的 委托类型
delegate string delegate_6(string a6, string b6);
//7.Action委托和Func 委托区别在于 Action 只能定义无返回值类型的委托 Func只能定义有返回值的类型委托
// Action委托 是system命名空间中的系统提供的内置委托类型 using System
//7.1
// Action 代表 无参数的无返回值委托类型
delegate void delegate_7();
//7.2
// Action<T> 代表 无返回值 有一个参数T的委托类型 T可以是任何类型 int string等 正常用法和3相同
//7.3
//Action<T,T>代表 无返回值 有两个个参数T的委托类型
//8.Func<T> 委托
// Func<T> 代表 有返回值委托类型 T代表返回值类型 必须要有返回值
//正常为委托类型 2
//Func<T,T,T,T> 从第二个T开始 都是委托的参数类型


void Start()
{
//1.使用
//第一种方式
delegate_1 a1 = new delegate_1(Eat1);
a1();
//第二种使用方式
delegate_1 b1 = Eat1;
b1();
//2.使用 以下只备注第二种使用方法
delegate_2 a2 = Eat2;
string b2 = a2();
print(b2);
//3.使用
delegate_3 c3 = Eat3;
c3(100);
//4.使用
delegate_4 e4 = Eat4;
e4(111, "吃了吗!!!!");
int f4 = e4(111, "吃了吗!!!!");
print(f4);
//5.使用
delegate_5_1 a5 = Eat5_1;
delegate_5_2 f5 = Eat5_2;
f5(222, a5);
//6.使用
delegate_6 f6 = Eat6_1;
string g6 = Eat6_2(f6);
print(g6);
// 7.使用
//7.1
//一般使用方法
delegate_7 a7 = Eat7_1;
a7();
//Action委托
Action b7 = Eat7_2;
b7();
//7.2
Action<int> e7 = Eat7_3;
e7(100);
//8.
Func<int> a8 = Eat8;
a8();

}
//定义对应的方法
//1.
private void Eat1()
{
print("吃了吗!");
}
//2.
private string Eat2()
{
return ("吃了吗!!");
}
//3.
private void Eat3(int b3)
{
print(b3);
print("吃了吗!!!");
}
//4.
private int Eat4(int c4, string d4)
{
print(c4);
print("吃了!吗!!!");
return (444);
}
//5.
private void Eat5_1()
{
print("吃了吗!");
}
private void Eat5_2(int d5, delegate_5_1 e5)
{
e5();
}
//6.
private string Eat6_1(string c6,string d6)
{
return c6 + d6;
}
private string Eat6_2(delegate_6 e6)
{
return e6("张三", "李四");
}
//7. 7.1
private void Eat7_1()
{
print("吃了吗!7_1");
}
private void Eat7_2()
{
print("吃了吗!7_2");
}
//7.2
private void Eat7_3(int a7)
{
print(a7);
print("吃了吗!7_3");
}
//8.0
private int Eat8()
{
return (8888);
}
void Update () {

}
}