WPF之C#委托入门(二)

Day3  学习WPF之委托以致用

1、模板方法,“借用”指定的外部方法来产生结果,委托有返回值

Func<Product> func1 = new Func<Product>(productFactory.MakePizza);

Func类型的委托,尖括号<>内第一个参数为返回值类型,若后面还有参数则为输入参数列表。

圆括号()里面的内容,类似将函数指针指向productFactory.MakePizza()这个方法。

通过委托间接调用了productFactory.MakePizza的逻辑

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace DelegateDemo
{
    class program
    {
        static void Main(string [] args)
        {
        ProductFactory productFactory = new ProductFactory();//产品成产工厂的实例,有了实例就能调用方法
        WrapFactory wrapFactory = new WrapFactory();//产品包装工厂的实例

        Func<Product> func1 = new Func<Product>(productFactory.MakePizza);
        Func<Product> func2 = new Func<Product>(productFactory.MakeToyCar);

        Box box1 = wrapFactory.WrapProduct(func1);//用Box类型的变量接收
        Box box2 = wrapFactory.WrapProduct(func2);

        Console.WriteLine(box1.Product.Name);
        Console.WriteLine(box2.Product.Name);
        }
    }

    class Product //定义一个product类,每个产品有一个自己的属性(名字)
    {
        public string Name { get; set; }
    }

    class Box //定义一个box类,每个包装箱里面有个属性是product类型的,就是这个箱子里包装的产品
    {
        public Product Product { get; set; }
    }

    class WrapFactory //负责把产品包上盒子然后交给用户
    {
        public Box WrapProduct(Func<Product>getProduct)//getproduct为委托名,返回值类型为Product,参数列表为空
        //方法WrapProduct,这个方法就是模板,接收一个委托类型的参数,委托选择Func,返回一个product类型的参数
        //作用:将product放入box中
        //模板方法
        {
            Box box = new Box();//准备一个box
            Product product = getProduct.Invoke();//间接调用,当执行Func<Product>(productFactory.MakePizza);时,将productFactory.MakePizza()方法传给getproduct
            box.Product = product;
            return box;
        }    
    }

    class ProductFactory
    {
        public Product MakePizza()//方法:返回值类型为Product
        {
            Product product = new Product();
            product.Name = "Pizza";
            return product;
        }

        public Product MakeToyCar()
        {
            Product product = new Product();
            product.Name = "Toy Car";
            return product;
        }
    }
}

2、回调方法,调用指定的外部方法,委托无返回值

Action<Product>logCallback该方法只有一个参数,并且不返回值(Action类型的委托不具有返回值,但可以有参数列表)

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace DelegateDemo
{
    class program
    {
        static void Main(string [] args)
        {
        ProductFactory productFactory = new ProductFactory();//产品成产工厂的实例,有了实例就能调用方法
        WrapFactory wrapFactory = new WrapFactory();//产品包装工厂的实例

        Func<Product> func1 = new Func<Product>(productFactory.MakePizza);
        Func<Product> func2 = new Func<Product>(productFactory.MakeToyCar);

        Logger logger = new Logger();//创建logger实例调用log
        Action<Product> log = new Action<Product>(logger.Log);//无返回值的委托Action

        Box box1 = wrapFactory.WrapProduct(func1,log);//用Box类型的变量接收
        Box box2 = wrapFactory.WrapProduct(func2,log);

        Console.WriteLine(box1.Product.Name);
        Console.WriteLine(box2.Product.Name);
        }
    }

    class Logger//记录程序运行状态,一般无返回值
    {
        public void Log(Product product)
        {
            Console.WriteLine("Product'{0}'created at{1}.Price is {2}",product.Name,DateTime.UtcNow,product.Price);//用UtcNow不带时区的时间
        }
    }

    class Product //定义一个product类,每个产品有一个自己的属性(名字)
    {
        public string Name { get; set; }
        public double Price { get; set; }
    }

    class Box //定义一个box类,每个包装箱里面有个属性是product类型的,就是这个箱子里包装的产品
    {
        public Product Product { get; set; }
    }

    class WrapFactory //负责把产品包上盒子然后交给用户
    {
        public Box WrapProduct(Func<Product>getProduct,Action<Product>logCallback)//getproduct为委托名,返回值类型为Product,参数列表为空
        //方法WrapProduct,返回Box类型;Func类型的委托返回Product类型;Action类型的委托接收一个product类型的参数
        //作用:将product放入box中
        {
            Box box = new Box();//准备一个box
            Product product = getProduct.Invoke();//间接调用,当执行Func<Product>(productFactory.MakePizza);时,将productFactory.MakePizza()方法传给getproduct
            if (product.Price >= 50)
            {
                logCallback(product);//如果产品价格大于50就记录一下
            }

            box.Product = product;
            return box;
        }    
    }

    class ProductFactory
    {
        public Product MakePizza()//方法:返回值类型为Product
        {
            Product product = new Product();
            product.Name = "Pizza";
            product.Price = 12;
            return product;
        }

        public Product MakeToyCar()
        {
            Product product = new Product();
            product.Name = "Toy Car";
            product.Price = 100;
            return product;
        }
    }
}

 

 

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值