ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

委托的简单使用

2022-03-01 01:02:44  阅读:155  来源: 互联网

标签:委托 Cup int 简单 maxPrice 使用 cups public 杯子


在说明委托之前,我们先直接来个简单的例子,假如现在你要去筛选一个杯子的信息,可以提供给你关于杯子的信息有如:杯子的价格、杯子的评分等。暂且先以前两项为主。现让你找出价格最高的杯子和评分最高的杯子,那么对应的代码其实很简单,如下:
先定义有关杯子的信息:

public class Cup
{
    public int price;
    public int grade;
    public Cup(int price,int grade)
    {
        this.price = price;
        this.grade = grade;
    }
}
  • 在定义获取杯子最高价格和最高评分的方法:
    public int GetMostGrade(Cup[] cups)
    {
        int maxGrade = cups[0].grade;
        for (int i = 1; i < cups.Length; i++)
        {
            if (cups[i].grade > maxGrade)
            {
                maxGrade = cups[i].grade;
            }
        }
        return maxGrade;
    }
    public int GetMostPrice(Cup[] cups)
    {
        int maxPrice = cups[0].price;
        for (int i = 1; i < cups.Length; i++)
        {
            if (cups[i].price > maxPrice)
            {
                maxPrice = cups[i].price;
            }
        }
        return maxPrice;
    }
  • 最后我们可以在Start()方法里面测试(该脚本是在Unity项目中测试的)
void Start()
    {
        Cup[] cups = { new Cup(1, 5), new Cup(4, 2), new Cup(6, 3) };
        int maxPrice = GetMostPrice(cups);
        int maxGrade = GetMostGrade(cups);
        Debug.Log("MaxPrice " + maxPrice);
        Debug.Log("MaxGrade " + maxGrade);
    }
  • 我们运行程序,得到以下信息:

在这里插入图片描述

  • 嗯,看起来似乎没有什么问题。也能正确打印信息。但是,你可能注意到就是代码部分看起来有过多的冗余,没错,正是这样。我们在编写获取杯子价格和评分的方法的时候,运用到的运算逻辑都是一样的,唯一的区别就是比较的因素不同,即一个是价格一个是评分。假如现在我们需要添加一个筛选的信息,比如杯子的销量好了,那按照上面的逻辑,是不是又要添加一个GetMostSlaesVolume()方法,然后将GetMosePrise()方法里的代码Copy进去,将cup.prise改为cup.laesVolume;假如有几百个这样的方法,那么冗余量是不是大大增加。那怎么办嘞,我们如何来精简这些重复的代码?
    我们思考一下,不难发现,其实只要将方法中相同的部分保留,不同的部分给提取出来,然后参数化,针对不同的需求,我们只需要传入不同的参数就可以了。那么本例中的“不同部分”就是杯子的各个信息了。我们不妨定义一类方法,很简单,即获取杯子的信息
    public int GetPrice(Cup cup)
    {
        return cup.price;
    }
    public int GetGrade(Cup cup)
    {
        return cup.grade;
    }
  • 上面方法的返回值就是我们需要传入到 “获取最大值的方法” 中的参数了,是不。上面也说到了,其实就是传入各个因素。那我们如何传入这些参数呢,没错,就是用到标题说的委托了,我们定义并声明和上面方法匹配的委托:
    public delegate int StudentDelegate(Cup cup);
    public StudentDelegate myDelegate;
  • 然后我们改写原本的筛选逻辑,这次我们以委托的方式传入参数
    public int GetMostElement(StudentDelegate studentDelegate,Cup[] cups)
    {
        int maxElement = studentDelegate(cups[0]);
        for (int i = 1; i < cups.Length; i++)
        {
            if(studentDelegate(cups[i]) > maxElement)
            {
                maxElement = studentDelegate(cups[i]);
            }
        }
        return maxElement;
    }
  • 接着,在Start()方法里改写测试代码:
    void Start()
    {
        Cup[] cups = { new Cup(1, 5), new Cup(4, 2), new Cup(6, 3) };
        int maxPrice = GetMostElement(GetPrice, cups);
        int maxGrade = GetMostElement(GetGrade, cups);
        Debug.Log("MaxPrice " + maxPrice);
        Debug.Log("MaxGrade " + maxGrade);
    }
  • 可以看到,当我们有新的筛选需求时,只要往方法里注册不同的委托参数即可。这样一来,当添加新的类似需求时,也可以快速添加,且不会有代码冗余。另外,也是符合开闭原则的。
    输出的结果也是和上面的一样,就不贴图了。

标签:委托,Cup,int,简单,maxPrice,使用,cups,public,杯子
来源: https://www.cnblogs.com/LemonInCup/p/15948350.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有