1、 作业内容
使用 C# 编码(涉及类、接口、委托等关键知识点),实现对周黑鸭工厂的产品生产统一管理,主要产品包括鸭脖和鸭翅。武汉工厂能生生产鸭脖和鸭翅,南京工厂只能生产鸭翅,长沙工厂只能生产鸭脖。
2、 主要思路
想要解决诸如此类"多个同级子类实现同一功能"的问题,需要使用接口的知识。在这个问题中,通过定义一个公共的接口,让不同的工厂实现相同的生产功能,所以我们把生产这个动作定义为接口。
interface IProductionFactory1
{
void ProductYB();
}
interface IProductionFactory2
{
void ProductYC();
}
之所以定义两个接口,是为了解决部分工厂只有部分生产功能的问题,让对应功能的工厂继承对应的接口。
定义完接口,我们需要分别定义工厂类继承接口。
class WuhanFactory : IProductionFactory1, IProductionFactory2
{
public void ProductYB() { Console.WriteLine("鸭脖已于武汉生产。"); }
public void ProductYC() { Console.WriteLine("鸭翅已于武汉生产。"); }
}
剩下两个工厂类以此类推,这里不过多赘述。
完成工厂类的定义后,我们需要实现三个工厂的生产工作的同时进行,如何实现“同时”这个动作,我们引入事件与委托。委托是用来实现事件的批量实现,所以我们需要将事件与生产动作联系起来。
声明委托和事件:
public delegate void ProductionDelegate();
public event ProductionDelegate Production;
委托与事件的执行:
WuhanFactory Fac1 = new WuhanFactory();
NanjingFactory Fac2 = new NanjingFactory();
ChangshaFactory Fac3 = new ChangshaFactory();
ProductionDelegate Pro1 = Fac1.ProductYB;
ProductionDelegate Pro2 = Fac1.ProductYC;
ProductionDelegate Pro3 = Fac2.ProductYC;
ProductionDelegate Pro4 = Fac3.ProductYB;
Program m1 = new Program();
m1.Production += Pro1;
m1.Production += Pro2;
m1.Production += Pro3;
m1.Production += Pro4;
m1.Production();
3、 难点
本题目中接口的理解并不困难,需要体会的是事件与委托的声明与定义。
public delegate void ProductionDelegate();
public event ProductionDelegate Production;
第一行是委托的声明,事件的声明紧跟在委托后。注意,委托名后的括号内参数应该与工厂类的接口实现函数的参数相同,同时,事件的声明中无需带括号。
WuhanFactory Fac1 = new WuhanFactory();
创造工厂类实例后,通过该实例访问生产函数“初始化”委托。
ProductionDelegate Pro1 = Fac1.ProductYB;
需要注意的是,事件的访问方式是需要创建事件声明类下的实例,通过实例来访问,所以我们创建Progarm类的实例来访问事件。
Program m1 = new Program();
m1.Production += Pro1;
m1.Production += Pro2;
m1.Production += Pro3;
m1.Production += Pro4;
最后通过实例访问事件,给事件传递相应生产函数的参数,即可实现事件的“批次”委托处理。
4、 运行截图:
5、 实现代码
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Interface
{
interface IProductionFactory1
{
void ProductYB();
}
interface IProductionFactory2
{
void ProductYC();
}
class WuhanFactory : IProductionFactory1, IProductionFactory2
{
public void ProductYB() { Console.WriteLine("鸭脖已于武汉生产。"); }
public void ProductYC() { Console.WriteLine("鸭翅已于武汉生产。"); }
}
class NanjingFactory : IProductionFactory2
{
public void ProductYC() { Console.WriteLine("鸭翅已于南京生产。"); }
}
class ChangshaFactory : IProductionFactory1
{
public void ProductYB() { Console.WriteLine("鸭脖已于长沙生产。"); }
}
internal class Program
{
public delegate void ProductionDelegate();
public event ProductionDelegate Production;
static void Main(string[] args)
{
WuhanFactory Fac1 = new WuhanFactory();
NanjingFactory Fac2 = new NanjingFactory();
ChangshaFactory Fac3 = new ChangshaFactory();
ProductionDelegate Pro1 = Fac1.ProductYB;
ProductionDelegate Pro2 = Fac1.ProductYC;
ProductionDelegate Pro3 = Fac2.ProductYC;
ProductionDelegate Pro4 = Fac3.ProductYB;
Program m1 = new Program();
m1.Production += Pro1;
m1.Production += Pro2;
m1.Production += Pro3;
m1.Production += Pro4;
m1.Production();
Console.ReadLine();
}
}
}