windows程序设计课程作业一:使用 C# 编码(涉及类、接口、委托等关键知识点),实现对周黑鸭工厂的产品生产统一管理,主要产品包括鸭脖和鸭翅。

一.作业内容

使用 C# 编码(涉及类、接口、委托等关键知识点),实现对周黑鸭工厂的产品生产统一管理,主要产品包括鸭脖和鸭翅。武汉工厂能生生产鸭脖和鸭翅,南京工厂只能生产鸭翅,长沙工厂只能生产鸭脖。具体要求如下:

  1. 定义接口 IProductionFactory,包含生产鸭脖和鸭翅的方法。
  2. 定义类 WuhanFactory、NanjingFactory、ChangshaFactory 分别实现接口 IProductionFactory,用于具体的生产工厂。
  3. 使用委托 ProductionDelegate 定义生产委托。
  4. 在 Main 函数中,创建不同工厂的实例,并通过生产委托进行生产。

二.接口的定义与实现

2.1定义生产鸭脖和鸭翅的接口 

首先我们定义一个接口IProductionFactory,包含生产鸭脖和鸭翅的方法。

public interface IProductionFactory  
{  
    void ProduceDuckNeck();  
    void ProduceDuckWings();  
}

2.2创建三个工厂类

我们创建三个工厂类:WuhanFactory、NanjingFactory 和 ChangshaFactory,它们分别实现了 IProductionFactory 接口。每个工厂类根据自己的能力提供具体的产品生产实现。

// 武汉工厂,能生产鸭脖和鸭翅  
public class WuhanFactory : IProductionFactory  
{  
    public void ProduceDuckNeck()  
    {  
        Console.WriteLine("武汉工厂生产鸭脖");  
    }  
  
    public void ProduceDuckWings()  
    {  
        Console.WriteLine("武汉工厂生产鸭翅");  
    }  
}  
  
// 南京工厂,只能生产鸭翅  
public class NanjingFactory : IProductionFactory  
{  
    public void ProduceDuckNeck()  
    {  
        throw new NotImplementedException("南京工厂不能生产鸭脖");  
    }  
  
    public void ProduceDuckWings()  
    {  
        Console.WriteLine("南京工厂生产鸭翅");  
    }  
}  
  
// 长沙工厂,只能生产鸭脖  
public class ChangshaFactory : IProductionFactory  
{  
    public void ProduceDuckNeck()  
    {  
        Console.WriteLine("长沙工厂生产鸭脖");  
    }  
  
    public void ProduceDuckWings()  
    {  
        throw new NotImplementedException("长沙工厂不能生产鸭翅");  
    }  
}  

注意,南京工厂不能生产鸭脖,所以它的 ProduceDuckNeck 方法会抛出一个 NotSupportedException 异常。同样,长沙工厂不能生产鸭翅,所以它的 ProduceDuckWings 方法也会抛出异常。

为了增强代码的灵活性和可扩展性,我们还定义了一个生产委托 ProductionDelegate,它表示没有参数且没有返回值的委托。这个委托可以用来动态地调用不同工厂的生产方法。

三.委托的引入与应用

 3.1生产委托

为了增强代码的灵活性和可扩展性,我们还定义了一个生产委托 ProductionDelegate,它表示没有参数且没有返回值的委托。这个委托可以用来动态地调用不同工厂的生产方法。

public delegate void ProductionDelegate();

3.2 委托生产

现在,我们可以在Main函数中创建不同工厂的实例,并通过生产委托进行产品的生产。

class Program  
{  
    static void Main(string[] args)  
    {  
        // 创建不同工厂的实例  
        IProductionFactory wuhanFactory = new WuhanFactory();  
        IProductionFactory nanjingFactory = new NanjingFactory();  
        IProductionFactory changshaFactory = new ChangshaFactory();  
  
        // 使用生产委托进行生产  
        try  
        {  
            ProduceProduct(wuhanFactory, "鸭脖");  
            ProduceProduct(wuhanFactory, "鸭翅");  
            ProduceProduct(nanjingFactory, "鸭翅");  
            // 长沙工厂不能生产鸭翅,会抛出异常  
            // ProduceProduct(changshaFactory, "鸭翅");  
            ProduceProduct(changshaFactory, "鸭脖");  
        }  
        catch (NotSupportedException ex)  
        {  
            Console.WriteLine($"生产失败: {ex.Message}");  
        }  
  
        Console.WriteLine("所有产品生产完成。");  
        Console.ReadLine();  
    }  

3.3 处理异常

ProduceProduct 方法接收一个工厂实例和一个产品类型字符串作为参数。它使用了一个 switch 语句来根据产品类型选择调用哪个生产方法。如果工厂不能生产指定的产品,会捕获并打印出异常信息。

static void ProduceProduct(IProductionFactory factory, string productType)  
{  
    ProductionDelegate produceDelegate = null;  
    switch (productType)  
    {  
        case "鸭脖":  
            produceDelegate = factory.ProduceDuckNeck;  
            break;  
        case "鸭翅":  
            produceDelegate = factory.ProduceDuckWings;  
            break;  
        default:  
            // 不支持的产品类型  
            return;  
    }  
  
    if (produceDelegate != null)  
    {  
        try  
        {  
            // 调用生产方法  
            produceDelegate.Invoke();  
        }  
        catch (Exception ex)  
        {  
            // 处理异常  
        }  
    }  
}

在 Main 函数中调用 ProduceProduct 时,我们故意尝试让长沙工厂生产鸭翅,这会导致一个 NotSupportedException 异常被抛出。通过捕获这个异常,我们可以处理这种情况,而不是让程序崩溃。

四.代码实现与结果

4.1完整代码

using System;  
  
// 定义生产委托  
public delegate void ProductionDelegate();  
  
// 定义产品接口  
public interface IProductionFactory  
{  
    void ProduceDuckNeck();  
    void ProduceDuckWings();  
}  
  
// 武汉工厂,能生产鸭脖和鸭翅  
public class WuhanFactory : IProductionFactory  
{  
    public void ProduceDuckNeck()  
    {  
        Console.WriteLine("武汉工厂生产鸭脖");  
    }  
  
    public void ProduceDuckWings()  
    {  
        Console.WriteLine("武汉工厂生产鸭翅");  
    }  
}  
  
// 南京工厂,只能生产鸭翅  
public class NanjingFactory : IProductionFactory  
{  
    public void ProduceDuckNeck()  
    {  
        throw new NotSupportedException("南京工厂不能生产鸭脖");  
    }  
  
    public void ProduceDuckWings()  
    {  
        Console.WriteLine("南京工厂生产鸭翅");  
    }  
}  
  
// 长沙工厂,只能生产鸭脖  
public class ChangshaFactory : IProductionFactory  
{  
    public void ProduceDuckNeck()  
    {  
        Console.WriteLine("长沙工厂生产鸭脖");  
    }  
  
    public void ProduceDuckWings()  
    {  
        throw new NotSupportedException("长沙工厂不能生产鸭翅");  
    }  
}  
  
class Program  
{  
    static void Main(string[] args)  
    {  
        // 创建不同工厂的实例  
        IProductionFactory wuhanFactory = new WuhanFactory();  
        IProductionFactory nanjingFactory = new NanjingFactory();  
        IProductionFactory changshaFactory = new ChangshaFactory();  
  
        // 使用生产委托进行生产  
        try  
        {  
            ProduceProduct(wuhanFactory, "鸭脖");  
            ProduceProduct(wuhanFactory, "鸭翅");  
            ProduceProduct(nanjingFactory, "鸭翅");  
            // 长沙工厂不能生产鸭翅,会抛出异常  
            // ProduceProduct(changshaFactory, "鸭翅");  
            ProduceProduct(changshaFactory, "鸭脖");  
        }  
        catch (NotSupportedException ex)  
        {  
            Console.WriteLine($"生产失败: {ex.Message}");  
        }  
  
        Console.WriteLine("所有产品生产完成。");  
        Console.ReadLine();  
    }  
  
    static void ProduceProduct(IProductionFactory factory, string productType)  
    {  
        ProductionDelegate produceDelegate = null;  
        switch (productType)  
        {  
            case "鸭脖":  
                produceDelegate = factory.ProduceDuckNeck;  
                break;  
            case "鸭翅":  
                produceDelegate = factory.ProduceDuckWings;  
                break;  
            default:  
                Console.WriteLine("不支持的产品类型。");  
                return;  
        }  
  
        if (produceDelegate != null)  
        {  
            try  
            {  
                produceDelegate.Invoke();  
            }  
            catch (Exception ex)  
            {  
                Console.WriteLine($"在生产 {productType} 时出错: {ex.Message}");  
            }  
        }  
    }  
}

4.2结果 

五.难点分析与结论

5.1难点分析

1.委托的理解与使用:在这个示例中,ProductionDelegate 委托用于指向工厂类中的生产方法。对于我来说,理解委托的概念以及如何使用它是一个难点。需要弄清楚委托的定义、声明、实例化以及调用的过程。

2.接口与多态性的应用:IProductionFactory 接口定义了工厂类必须实现的方法。通过接口,我们可以确保所有工厂类都遵循相同的规范,并且在运行时,可以通过接口类型的变量来调用具体工厂类的实现。多态性是面向对象编程的四大特性之一,但理解和应用它可能需要一些时间和实践。

3.异常处理:在示例中,某些工厂类可能不支持生产特定的产品,因此会抛出 NotSupportedException。

5.2结论

       这个示例展示了C#中委托、接口、多态性和异常处理等多个重要概念的应用,同时也展示了工厂设计模式的基本实现。通过学习和实践这个示例,开发者可以加深对C#语言特性和面向对象编程原则的理解,提高编写高质量代码的能力。同时,通过应用工厂模式,可以提高代码的灵活性和可维护性,使得系统更加易于扩展和修改。然而,理解和掌握这些概念和模式需要一定的时间和实践,开发者需要不断地学习和实践才能熟练掌握它们。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值