C#委托操作实例

执行方法主体

static void Main(string[] args)
{

    //创建实例
    //准备ProductFactory类的实例
    ProductFactory productFactory = new ProductFactory();
    //准备WrapFactory类的实例
    WrapFactory wrapFactory = new WrapFactory();

    //创建Func委托
    //定义为func1,用来委托ProductFactory类的MakePizza方法,
    Func<Product> func1 = new Func<Product>(productFactory.MakePizza);
    //定义为func2,用来委托ProductFactory类的MakeToyCar方法,
    Func<Product> func2 = new Func<Product>(productFactory.MakeToyCar);

    //进行包装,将上面定义的func1委托作为参数传进去
    //WrapProduct这个方法的返回值类型为Box类型,所以我们使用Box变量进行接收返回值
    //虽然调用的是同一个方法,但是因为传进去的委托不同(被委托的方法不同),所以返回结果也不同
    //func1委托的方法是披萨,所以返回披萨
    Box box1 = wrapFactory.WrapProduct(func1);
    //func2委托的方法是玩具车,所以返回玩具车
    Box box2 = wrapFactory.WrapProduct(func2);

    //输出,包装.产品.名称
    Console.WriteLine(box1.Product.Name);
    Console.WriteLine(box2.Product.Name);

}

创建产品模型

/// <summary>
/// 产品类
/// </summary>
class Product
{
    /// <summary>
    /// 产品的名称
    /// </summary>
    public string Name { get; set; }
}

创建包装模型

/// <summary>
/// 包装类
/// </summary>
class Box
{
    /// <summary>
    /// 需要包装的产品
    /// </summary>
    public Product Product { get; set; }
}

创建一个包装工厂类

/// <summary>
/// 创建一个包装工厂
/// </summary>
class WrapFactory
{

    /// <summary>
    /// 进行包装产品的方法
    /// </summary>
    /// <param name="getProduct">主体main里面的自定义委托:func1,func1被委托调用productFactory类的MakePizza方法</param>
    /// <returns></returns>
    public Box WrapProduct(Func<Product> getProduct)
    {
        //创建一个新的包装
        Box box = new Box();
        //产品类型接收,调用被委托的方法
        Product product = getProduct.Invoke();
        //将被委托的方法的返回值放到包装里面
        box.Product = product;
        //返回包装
        return box;
    }
}

创建一个产品工厂类

/// <summary>
/// 创建一个产品工厂类
/// </summary>
class ProductFactory
{
    /// <summary>
    /// 方法一
    /// </summary>
    /// <returns>返回:披萨</returns>
    public Product MakePizza()
    {
        //实例化Product类
        Product product = new Product();
        //赋值该类中的Name属性为披萨
        product.Name = "披萨";
        //返回Product类型数据,需要使用Product类型进行接收
        return product;
    }

    /// <summary>
    /// 方法二
    /// </summary>
    /// <returns>返回:玩具车</returns>
    public Product MakeToyCar()
    {
        //实例化Product类
        Product product = new Product();
        //赋值该类中的Name属性为玩具车
        product.Name = "玩具车";
        //返回Product类型数据,需要使用Product类型进行接收
        return product;
    }

}
© 版权声明
THE END
喜欢就支持一下吧
点赞5赞赏
分享
评论 抢沙发

请登录后发表评论