前言
为什么会写这篇文章呢?第一肯定是为了完成老师布置的作业,第二是为了提高自己写博客的能力,最后希望这篇文章对正在学习c#的您有帮助
一、作业题目
使用 C# 编码(涉及类、接口、委托等关键知识点),实现对周黑鸭工厂的产品生产统一管理,主要产品包括鸭脖和鸭翅。武汉工厂能生生产鸭脖和鸭翅,南京工厂只能生产鸭翅,长沙工厂只能生产鸭脖。具体要求如下:
- 定义接口 IProductionFactory,包含生产鸭脖和鸭翅的方法。
- 定义类 WuhanFactory、NanjingFactory、ChangshaFactory 分别实现接口 IProductionFactory,用于具体的生产工厂。
- 使用委托 ProductionDelegate 定义生产委托。
- 在 Main 函数中,创建不同工厂的实例,并通过生产委托进行生产。
二、问题分析
根据题干,我们知道需要使用接口,委托等方法。这两个方法的使用也正是本题的难点所在。
所以我们要分析一下我们怎么解决这两个难题。
- 接口设计与实现:
- 定义接口
IProductionFactory
时需要准确抽象出鸭脖和鸭翅生产的公共行为,确保接口的方法能够适用于所有实现该接口的类。 - 在实现接口的各个工厂类中,需要处理工厂不能生产某种产品的情况。在这个例子中,南京工厂不能生产鸭脖,长沙工厂不能生产鸭翅,这就需要通过某种方式来反映这种限制。在提供的代码中,这是通过抛出
NotImplementedException
来实现的,但这可能不是最佳的用户体验,因为异常处理通常用于异常情况,而这种情况在设计上是已知的。
- 定义接口
- 委托的使用:
- 委托
ProductionDelegate
的设计需要考虑到它能够接受一个工厂对象,并调用其生产方法。委托的定义和使用需要理解委托类型与所引用方法的签名必须匹配。 - 在使用委托调用生产方法时,需要处理可能出现的异常情况,特别是当某些工厂不支持生产某种产品时。
- 委托
三、解决问题的基础
1、接口的使用方法
在本题中,接口的作用是:接口允许一个类实现多个接口,这样可以在同一个类中实现不同接口的方法。这使得对象可以根据调用时的上下文执行不同的操作,提高了代码的灵活性和可复用性。只是很简单的使用接口,代码如下:
// 定义生产接口
public interface IProductionFactory
{
void ProduceDuckNeck(); // 生产鸭脖的方法
void ProduceDuckWing(); // 生产鸭翅的方法
}
2、委托的使用方法
委托是一种类型,它封装了方法的签名和定义,可以被当做参数来传递或赋值给变量。
本题委托定义的代码:
public delegate void ProductionDelegate();
四、具体代码的实现
在知道了本题所需要的基础后,我们来看看本题的具体代码是什么吧
1、类的定义
// 武汉工厂类,实现IProductionFactory接口
public class WuhanFactory : IProductionFactory
{
public void ProduceDuckNeck()
{
Console.WriteLine("武汉工厂生产了鸭脖");
}
public void ProduceDuckWing()
{
Console.WriteLine("武汉工厂生产了鸭翅");
}
}
// 南京工厂类,实现IProductionFactory接口
public class NanjingFactory : IProductionFactory
{
public void ProduceDuckNeck()
{
throw new NotImplementedException("南京工厂不能生产鸭脖");
}
public void ProduceDuckWing()
{
Console.WriteLine("南京工厂生产了鸭翅");
}
}
// 长沙工厂类,实现IProductionFactory接口
public class ChangshaFactory : IProductionFactory
{
public void ProduceDuckNeck()
{
Console.WriteLine("长沙工厂生产了鸭脖");
}
public void ProduceDuckWing()
{
throw new NotImplementedException("长沙工厂不能生产鸭翅");
}
}
分别定义武汉、长沙、南京这三个类,并且实现他们所对应的接口里面的方法,对其是否能生产鸭脖和鸭翅进行定义
2、主函数的实现
static void Main(string[] args)
{
// 创建不同工厂的实例
IProductionFactory wuhanFactory = new WuhanFactory();
IProductionFactory nanjingFactory = new NanjingFactory();
IProductionFactory changshaFactory = new ChangshaFactory();
// 使用生产委托进行生产
ProductionDelegate DuckNeck = wuhanFactory.ProduceDuckNeck; //创建一个委托实例,并指向ProduceDuckNeck方法
DuckNeck += changshaFactory.ProduceDuckNeck;
DuckNeck.Invoke(); //Invoke()方法是委托对象的一个成员,用于调用该委托所引用的方法。
ProductionDelegate DuckWing = wuhanFactory.ProduceDuckWing;
DuckWing += nanjingFactory.ProduceDuckWing;
DuckWing.Invoke();
Console.ReadLine();
}
在主函数中,我们创建了不同工厂的实例,使用了委托进行生产,并且使用了委托里面的函数Invoke()。
五、学习心得
在解决上述关于“周黑鸭工厂”的问题时,我获得了不少的学习体验和心得。
首先,我深刻体会到了面向对象编程的核心理念。通过定义接口IProductionFactory
,我们为不同类型的工厂设定了一个通用的行为标准。这使我明白了抽象的重要性,它允许我们统一地看待和处理具有相似行为或属性的对象。
其次,通过实现该接口的WuhanFactory
、NanjingFactory
和ChangshaFactory
类,我学习到了如何根据实际需求定制类的行为。特别是在南京和长沙工厂中,我们通过抛出NotSupportedException
异常来处理不支持的生产行为,这是一种非常实用的错误处理机制。
再者,通过使用委托ProductionDelegate
,我进一步理解了委托在C#中的用法和重要性。委托允许我们将方法作为参数传递或赋值给变量,这提供了极大的灵活性,使得我们可以在运行时动态地决定要执行哪个方法。
最后,在Main
函数中整合所有这些元素并进行测试,我体验到了从设计到实现的完整过程。这不仅仅是编码,更多的是逻辑思维和问题解决的能力。
总的来说,这次学习让我更加熟悉了C#的面向对象编程特性,包括接口、类和委托的使用。同时,我也意识到了在实际开发中,合理地使用这些特性可以使代码更加清晰、灵活和可维护。
六、完整代码
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace zuoye1
{
internal class Program
{
// 定义生产接口
public interface IProductionFactory
{
void ProduceDuckNeck();
void ProduceDuckWing();
}
// 武汉工厂类,实现IProductionFactory接口
public class WuhanFactory : IProductionFactory
{
public void ProduceDuckNeck()
{
Console.WriteLine("武汉工厂生产了鸭脖");
}
public void ProduceDuckWing()
{
Console.WriteLine("武汉工厂生产了鸭翅");
}
}
// 南京工厂类,实现IProductionFactory接口
public class NanjingFactory : IProductionFactory
{
public void ProduceDuckNeck()
{
throw new NotImplementedException("南京工厂不能生产鸭脖");
}
public void ProduceDuckWing()
{
Console.WriteLine("南京工厂生产了鸭翅");
}
}
// 长沙工厂类,实现IProductionFactory接口
public class ChangshaFactory : IProductionFactory
{
public void ProduceDuckNeck()
{
Console.WriteLine("长沙工厂生产了鸭脖");
}
public void ProduceDuckWing()
{
throw new NotImplementedException("长沙工厂不能生产鸭翅");
}
}
// 定义生产委托
public delegate void ProductionDelegate();
static void Main(string[] args)
{
// 创建不同工厂的实例
IProductionFactory wuhanFactory = new WuhanFactory();
IProductionFactory nanjingFactory = new NanjingFactory();
IProductionFactory changshaFactory = new ChangshaFactory();
// 使用生产委托进行生产
ProductionDelegate DuckNeck = wuhanFactory.ProduceDuckNeck; //创建一个委托实例,并指向ProduceDuckNeck方法
DuckNeck += changshaFactory.ProduceDuckNeck;
DuckNeck.Invoke(); //Invoke()方法是委托对象的一个成员,用于调用该委托所引用的方法。
ProductionDelegate DuckWing = wuhanFactory.ProduceDuckWing;
DuckWing += nanjingFactory.ProduceDuckWing;
DuckWing.Invoke();
Console.ReadLine();
}
}
}
运行结果