1. 作业内容
使用 C# 编码(涉及类、接口、委托等关键知识点),实现对周黑鸭工厂的产品生产统一管理,主要产品包括鸭脖和鸭翅。武汉工厂能生生产鸭脖和鸭翅,南京工厂只能生产鸭翅,长沙工厂只能生产鸭脖。具体要求如下:
- 定义接口 IProductionFactory,包含生产鸭脖和鸭翅的方法。
- 定义类 WuhanFactory、NanjingFactory、ChangshaFactory 分别实现接口 IProductionFactory,用于具体的生产工厂。
- 使用委托 ProductionDelegate 定义生产委托。
- 在 Main 函数中,创建不同工厂的实例,并通过生产委托进行生产。
2. 设计思路分析
- 在 C# 中,接口和委托都是实现代码抽象和分离的重要工具。
- 接口定义了一组方法规范,但不提供实现。它们允许我们定义可以由多个类实现的契约,这些类可以有不同的行为但共享相同的方法签名。而在本项目中IProductionFactory 接口将确保所有工厂类都实现生产鸭脖和鸭翅的方法,但每个工厂可以有其独特的生产过程。
- 委托是一种类型,它安全地封装了一个方法的引用,允许将方法作为参数传递,或者将其赋给一个变量。而在本项目在的产管理系统中,委托可以用来引用生产方法,允许在运行时动态地更改调用的方法,增加了程序的灵活性。
- 在本项目中结合使用接口和委托可以创建一个灵活且可扩展的系统。接口IProductionFactory定义了必须实现的方法,而委托ProductionDelegate则允许在运行时动态地改变对象的行为。这样,就可以根据客户需要轻松地添加新的工厂类型,或者改变生产策略,而不需要修改现有的代码基础。
3. 代码实现
3.1接口定义
public interface IProductionFactory
{
void ProduceDuckNeck();
void ProduceDuckWing();
}
3.2工厂类实现
// 武汉工厂,能生产鸭脖和鸭翅
public class WuhanFactory : IProductionFactory
{
public void ProduceDuckNeck()
{
Console.WriteLine("武汉工厂生产鸭脖。");
}
public void ProduceDuckWing()
{
Console.WriteLine("武汉工厂生产鸭翅。");
}
}
// 南京工厂,只能生产鸭翅
public class NanjingFactory : IProductionFactory
{
public void ProduceDuckNeck()
{
throw new NotImplementedException("南京工厂不能生产鸭脖。");
}
public void ProduceDuckWing()
{
Console.WriteLine("南京工厂生产鸭翅。");
}
}
// 长沙工厂,只能生产鸭脖
public class ChangshaFactory : IProductionFactory
{
public void ProduceDuckNeck()
{
Console.WriteLine("长沙工厂生产鸭脖。");
}
public void ProduceDuckWing()
{
throw new NotImplementedException("长沙工厂不能生产鸭翅。");
}
}
// 创建工厂实例
IProductionFactory wuhan = new WuhanFactory();
IProductionFactory nanjing = new NanjingFactory();
IProductionFactory changsha = new ChangshaFactory();
在这里,我们创建了三个工厂类:WuhanFactory、NanjingFactory 和 ChangshaFactory,每个类都通过 IProductionFactory 接口来实现。由于不同工厂能够生产的产品不同,我们通过用不同方式实现接口方法来体现他们在生产上的差异:
若是能够实现生产该类产品,则正常输出语句xxx 工厂生产xx。
若是不能生产该产品,则抛出NotImplementedException异常,异常信息为xxx 不能生产xx。
3.3委托的定义
public delegate void ProductionDelegate();
定义一个名为ProductionDelegate的委托,它不带参数且不返回值,用于封装生产方法的调用。
3.4异常类处理
// 异常处理
Console.WriteLine("武汉工厂生产:");
try
{
wuhanProduction();
}
catch (NotImplementedException e)
{
Console.WriteLine($"生产异常: {e.Message}");
}
Console.WriteLine("");
Console.WriteLine("南京工厂生产:");
try
{
nanjingProduction();
}
catch (NotImplementedException e)
{
Console.WriteLine($"生产异常: {e.Message}");
}
Console.WriteLine("");
Console.WriteLine("长沙工厂生产:");
try
{
changshaProduction();
}
catch (NotImplementedException e)
{
Console.WriteLine($"生产异常: {e.Message}");
}
通过分别对每个工厂进行try和catch语句块来实现订单的执行,若在异常时也会及时抛出异常信息。
3.5输出结果
4.源代码
https://gitee.com/qk1xcn/windows.git
5.总结
通过本题,我对c#中的接口和委托有了更深的理解。在 C# 中,接口是定义一组方法签名的契约,而类(Class)则是接口契约的具体实现。接口为类提供了一个模板,使得不同的类可以共享同样的接口,但具有不同的实现。这样,我们可以在不同的上下文中重用接口,而不必关心具体的实现细节。委托是 C# 中的一种类型,它可以引用具有特定参数列表和返回类型的方法。委托类似于 C 或 C++ 中的函数指针,但它是类型安全的。委托被用来实现事件和回调方法,它允许方法作为参数传递给其他方法,是实现事件驱动编程的基础。
在本题中,IProductionFactory 接口定义了两个方法:ProduceDuckNeck 和 ProduceDuckWing。WuhanFactory、NanjingFactory 和 ChangshaFactory 类分别实现了这个接口。ProductionDelegate 委托被用来引用生产方法。在 Main 函数中,我们创建了不同工厂的实例,并通过委托调用它们的生产方法。这样,我们就可以灵活地管理不同工厂的生产过程,而不必关心具体的实现细节。这也展示了接口和委托在 C# 中的强大功能和灵活性。