一.作业内容
使用 C# 编码(涉及类、接口、委托等关键知识点),实现对周黑鸭工厂的产品生产统一管理,主要产品包括鸭脖和鸭翅。武汉工厂能生生产鸭脖和鸭翅,南京工厂只能生产鸭翅,长沙工厂只能生产鸭脖。具体要求如下:
- 定义接口 IProductionFactory,包含生产鸭脖和鸭翅的方法。
- 定义类 WuhanFactory、NanjingFactory、ChangshaFactory 分别实现接口IProductionFactory,用于具体的生产工厂。
- 使用委托 ProductionDelegate 定义生产委托。
- 在 Main 函数中,创建不同工厂的实例,并通过生产委托进行生产。
二.作业目的
掌握接口和委托的相关知识,能够自己写出接口和委托的大致程序框架,并能够运用相关知识解决一些简单的代码问题。
三.相关知识点
3.1接口
C#中的接口(Interface)是一种引用类型,它定义了一组方法、属性、事件或索引器的契约,但不提供实现。接口可以被类或其他接口实现,从而实现该接口定义的所有成员。接口的主要作用是定义一种规范或协议,使得不相关的类可以应用同一个实现方式不同的方法。接口可以有效避免程序中因多次引用相同的方法而造成的代码冗余。
3.2委托
C# 中的委托(Delegate)是一种类型,它安全地封装了方法的签名和方法的引用。委托类似于 C 或 C++ 中的函数指针,但它们是类型安全的,并且是面向对象的。委托允许将方法作为参数传递,或者将方法赋值给变量,从而实现回调和事件驱动程序设计。
四.代码实现思路
1.首先,根据题目的要求,我们需要定义接口IProductionFactory和委托ProductionDelegate,其中接口IProductionFactory我们新定义两个分别生产鸭脖和鸭翅的方法。
public delegate void ProductionDelegate(); //定义委托
public interface IProductionFactory //定义接口
{
void Production鸭脖(); //定义两个方法
void Production鸭翅();
}
2.然后,新定义类 WuhanFactory、NanjingFactory、ChangshaFactory 分别实现接口IProductionFactory,用于具体的生产工厂。
public class WuhanFactory: IProductionFactory //定义武汉类实现接口
{
public void Production鸭脖() //实现类中接口的方法
{
Console.WriteLine("武汉工厂生产鸭脖");
}
public void Production鸭翅()
{
Console.WriteLine("武汉工厂生产鸭翅");
}
}
public class NanjingFactory: IProductionFactory //定义南京类实现接口
{
public void Production鸭脖()
{
Console.WriteLine("南京工厂不能生产鸭脖");
}
public void Production鸭翅()
{
Console.WriteLine("南京工厂生产鸭翅");
}
}
public class ChangshaFactory : IProductionFactory //定义长沙类实现接口
{
public void Production鸭脖()
{
Console.WriteLine("长沙工厂生产鸭脖");
}
public void Production鸭翅()
{
Console.WriteLine("长沙工厂不能生产鸭翅");
}
}
需要注意,根据题目要求,武汉工厂能生生产鸭脖和鸭翅,南京工厂只能生产鸭翅,长沙工厂只能生产鸭脖。因此在实现类中接口的方法时,对于同一个方法这三个不同的类有不同的定义。
3.然后,我们在 Main 函数中创建不同工厂的实例,并通过生产委托进行生产。
(1)首先需要创建不同工厂的实例:
//创建工厂实例
IProductionFactory wuhanfactory = new WuhanFactory();
IProductionFactory nanjingfactory = new NanjingFactory();
IProductionFactory changshafactory = new ChangshaFactory();
(2)然后我们开始定义生产鸭脖和鸭翅的委托。在这个部分我分别定义了三个不同类的两个不同方法,并直接将其结果输出,以便于观察。
//定义生产鸭脖的委托并输出
ProductionDelegate product鸭脖 = wuhanfactory.Production鸭脖;
product鸭脖.Invoke(); //武汉工厂生产鸭脖
product鸭脖 = nanjingfactory.Production鸭脖;
product鸭脖.Invoke(); //南京工厂生产鸭脖
product鸭脖 = changshafactory.Production鸭脖;
product鸭脖.Invoke(); //长沙工厂生产鸭脖
Console.WriteLine();
//定义生产鸭翅的委托并输出
ProductionDelegate product鸭翅 = wuhanfactory.Production鸭翅;
product鸭翅.Invoke(); //武汉工厂生产鸭翅
product鸭翅 = nanjingfactory.Production鸭翅;
product鸭翅.Invoke(); //南京工厂生产鸭翅
product鸭翅 = changshafactory.Production鸭翅;
product鸭翅.Invoke(); //长沙工厂生产鸭翅
Console.WriteLine();
其中Console.WriteLine();是输出空行,用于分割不同部分的不同输出,便于观察。
(3)最后通过生产委托进行生产
//通过生产委托进行生产
product鸭脖.Invoke();
product鸭翅.Invoke();
Console.ReadLine();
记得在代码最后需要写上Console.ReadLine();否则代码的运行窗口无法停留,会一闪而过。
至此,此题的整体代码就大致完成了,下面我们可以看一下完整的可运行代码。
五.完整的代码
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace 周黑鸭
{
public delegate void ProductionDelegate(); //定义委托
public interface IProductionFactory //定义接口
{
void Production鸭脖(); //定义两个方法
void Production鸭翅();
}
public class WuhanFactory: IProductionFactory //定义武汉类实现接口
{
public void Production鸭脖() //实现类中接口的方法
{
Console.WriteLine("武汉工厂生产鸭脖");
}
public void Production鸭翅()
{
Console.WriteLine("武汉工厂生产鸭翅");
}
}
public class NanjingFactory: IProductionFactory //定义南京类实现接口
{
public void Production鸭脖()
{
Console.WriteLine("南京工厂不能生产鸭脖");
}
public void Production鸭翅()
{
Console.WriteLine("南京工厂生产鸭翅");
}
}
public class ChangshaFactory : IProductionFactory //定义长沙类实现接口
{
public void Production鸭脖()
{
Console.WriteLine("长沙工厂生产鸭脖");
}
public void Production鸭翅()
{
Console.WriteLine("长沙工厂不能生产鸭翅");
}
}
internal class Program
{
static void Main(string[] args)
{
//创建工厂实例
IProductionFactory wuhanfactory = new WuhanFactory();
IProductionFactory nanjingfactory = new NanjingFactory();
IProductionFactory changshafactory = new ChangshaFactory();
//定义生产鸭脖的委托并输出
ProductionDelegate product鸭脖 = wuhanfactory.Production鸭脖;
product鸭脖.Invoke(); //武汉工厂生产鸭脖
product鸭脖 = nanjingfactory.Production鸭脖;
product鸭脖.Invoke(); //南京工厂生产鸭脖
product鸭脖 = changshafactory.Production鸭脖;
product鸭脖.Invoke(); //长沙工厂生产鸭脖
Console.WriteLine();
//定义生产鸭翅的委托并输出
ProductionDelegate product鸭翅 = wuhanfactory.Production鸭翅;
product鸭翅.Invoke(); //武汉工厂生产鸭翅
product鸭翅 = nanjingfactory.Production鸭翅;
product鸭翅.Invoke(); //南京工厂生产鸭翅
product鸭翅 = changshafactory.Production鸭翅;
product鸭翅.Invoke(); //长沙工厂生产鸭翅
Console.WriteLine();
//通过生产委托进行生产
product鸭脖.Invoke();
product鸭翅.Invoke();
Console.ReadLine();
}
}
}
代码gitee网址:https://gitee.com/ydn777/
六.代码运行结果
下面是本文代码在VS中运行得到的结果:
其中第一段输出的是三个工厂分别生产鸭脖的委托,第二段输出的是三个工厂分别生产鸭翅的委托;最后一段是格外进行的两条生产鸭脖和鸭翅的委托代码的输出,可以观察到,当我们想要直接输出委托时,输出语句调用的是上文中最后定义的那个委托所对应的内容。
七.收获与小结
本次作业我们使用 C# 编码(涉及类、接口、委托等关键知识点),实现了对周黑鸭工厂的产品生产统一管理。作业的主要目的是让我们学会运用类,接口和委托的相关知识解决一些简单的实际问题,在编写代码的过程中,我学会了如何去定义和运用接口及委托。使用类和接口可以使我们在不同的类中使用同一种方法,并且不用在每个类中都重新在定义一次,还能让不同类中使用的同种方法有不同的内容,这大大简化了代码,避免了程序冗余。
本题中,我使用接口定义了Production鸭脖和Production鸭翅这两个方法,并在定义三个类 WuhanFactory、NanjingFactory、ChangshaFactory时将该接口进行实现。在不同的类中,由于题目给出的每个工厂的名字不同,生产的产品也不同,所以Production鸭脖和Production鸭翅这两个方法在不同类中所包含的内容也不同。运用了接口,我们就可以更简便的在不同工厂类中使用同一种生产产品的方法,而不用一遍遍的重复定义,这使代码能够更加简单清晰。最后,我使用委托调用了目标函数方法并输出了相应结果,完成了题目中的要求。