一、作业内容
使用 C# 编码(涉及类、接口、委托等关键知识点),实现对周黑鸭工厂的产品生产统一管理,主要产品包括鸭脖和鸭翅。武汉工厂能生生产鸭脖和鸭翅,南京工厂只能生产鸭翅,长沙工厂只能生产鸭脖。具体要求如下:
- 定义接口 IProductionFactory,包含生产鸭脖和鸭翅的方法。
- 定义类 WuhanFactory、NanjingFactory、ChangshaFactory 分别实现接口 IProductionFactory,用于具体的生产工厂。
- 使用委托 ProductionDelegate 定义生产委托。
- 在 Main 函数中,创建不同工厂的实例,并通过生产委托进行生产。
二、基本思路
定义接口: 首先定义一个接口
IProductionFactory
,里面包含两个方法,分别用于生产鸭脖和鸭翅。实现工厂类: 创建三个工厂类
WuhanFactory
、NanjingFactory
和ChangshaFactory
,它们都实现了IProductionFactory
接口,分别实现了生产鸭脖和鸭翅的方法。定义委托: 定义一个委托类型
ProductionDelegate
,用于引用工厂生产方法。创建委托实例: 在
Main
方法中,创建委托实例,并将工厂生产方法与委托关联起来。调用委托: 使用委托调用各个工厂的生产方法,并输出结果。
三、代码实现
1.定义一个接口IProductionFactory
//定义接口 IProductionFactory
public interface IProductionFactory//类中接口实现必须显示声明为public
{
string ProduceDuckNeck();//生产鸭脖的方法
string ProduceDuckWing();//生产鸭翅的方法
}
说明 :
- 定义了一个生产工厂的接口,其中包含了两个方法:
ProduceDuckNeck()
和ProduceDuckWing()
,分别表示生产鸭脖和鸭翅。
2.创建工厂类
(1)WuhanFactory
public class WuhanFactory: IProductionFactory
{
public string ProduceDuckNeck() { return "武汉工厂能生产鸭脖"; }
public string ProduceDuckWing() { return "武汉工厂能生产鸭翅"; }
}
(2)NanjingFactory
public class NanjingFactory : IProductionFactory
{
public string ProduceDuckNeck() { return "南京工厂不能生产鸭脖"; }
public string ProduceDuckWing() { return "南京工厂能生产鸭翅"; }
}
(3)ChangshaFactory
public class ChangshaFactory : IProductionFactory
{
public string ProduceDuckNeck() { return "长沙工厂能生产鸭脖"; }
public string ProduceDuckWing() { return "长沙工厂不能生产鸭翅"; }
}
说明:
- 这些类都实现了
IProductionFactory
接口,分别代表了武汉工厂、南京工厂和长沙工厂。 - 每个类中都实现了接口中定义的两个方法,分别返回了对应工厂能否生产鸭脖和鸭翅的信息。
3.定义委托
public delegate string ProductionDelegate();
说明:
- 定义了一个委托类型
ProductionDelegate
,用于引用生产工厂的方法。 - 通过委托的方式,可以将生产方法作为参数传递给委托,实现了工厂生产方法的动态调用。更灵活地组合和调用不同工厂的生产方法,同时提高了代码的可扩展性和可维护性。
4.Main方法
(1)创建了三个工厂类的实例:wuhanFactory
、nanjingFactory
和 changshaFactory
IProductionFactory wuhanFactory = new WuhanFactory();
IProductionFactory nanjingFactory = new NanjingFactory();
IProductionFactory changshaFactory = new ChangshaFactory();
(2)通过委托类型的变量 ProductionDelegate
来声明六个委托实例:wuhanProduction1
、wuhanProduction2、nanjingProduction1、nanjingProduction2
和 changshaProduction1、changshaProduction2
。这些委托实例用于引用工厂的生产方法。 接着将工厂的生产方法与相应的委托实例关联起来
ProductionDelegate wuhanproduction1 = wuhanFactory.ProduceDuckNeck;
ProductionDelegate wuhanproduction2 = wuhanFactory.ProduceDuckWing;
ProductionDelegate nanjingproduction1 = nanjingFactory.ProduceDuckNeck;
ProductionDelegate nanjingproduction2 = nanjingFactory.ProduceDuckWing;
ProductionDelegate changshaproduction1 = changshaFactory.ProduceDuckNeck;
ProductionDelegate changshaproduction2 = changshaFactory.ProduceDuckWing;
(3)通过调用委托实例来执行工厂的生产方法,并输出生产结果。
Console.WriteLine("武汉工厂的产品生产情况:\n");
Console.WriteLine(wuhanproduction1() + ';' + wuhanproduction2() + '\n');
Console.WriteLine("南京工厂的产品生产情况:\n");
Console.WriteLine(nanjingproduction1() + ';' + nanjingproduction2() + '\n');
Console.WriteLine("长沙工厂的产品生产情况:\n");
Console.WriteLine(changshaproduction1() + ';' + changshaproduction2() + '\n');
四、运行结果
五、遇到的问题
1.委托的调用方式有误。
在委托类型的变量后面应该加上括号 `()` 来调用委托所引用的方法,而我刚开始没有加上这些括号,导致委托并没有被执行,输出了委托对象的信息而不是委托引用的方法的返回值。
错误代码示例:Console.WriteLine(wuhanProduction1);
错误运行结果:
六、小结
通过本次实验,我学习了接口、委托和工厂模式的基本用法。熟练掌握接口和委托的定义和基本用法。虽然过程中也遇到了输出结果不对的问题,但通过上网查询也顺利解决。通过本次实验,我也明白了委托可以存储对方法的引用,并在需要时动态调用这些方法。这种动态调用的能力使得代码更加灵活,可以根据运行时的条件来决定调用哪些方法,从而实现更加复杂的逻辑。
七、完整代码
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Text;
using System.Threading.Tasks;
namespace windows课程作业一
{
//定义接口 IProductionFactory
public interface IProductionFactory//类中接口实现必须显示声明为public
{
string ProduceDuckNeck();//生产鸭脖的方法
string ProduceDuckWing();//生产鸭翅的方法
}
//定义生产委托
public delegate string ProductionDelegate();
public class WuhanFactory: IProductionFactory
{
public string ProduceDuckNeck() { return "武汉工厂能生产鸭脖"; }
public string ProduceDuckWing() { return "武汉工厂能生产鸭翅"; }
}
public class NanjingFactory : IProductionFactory
{
public string ProduceDuckNeck() { return "南京工厂不能生产鸭脖"; }
public string ProduceDuckWing() { return "南京工厂能生产鸭翅"; }
}
public class ChangshaFactory : IProductionFactory
{
public string ProduceDuckNeck() { return "长沙工厂能生产鸭脖"; }
public string ProduceDuckWing() { return "长沙工厂不能生产鸭翅"; }
}
internal class Program
{
static void Main(string[] args)
{
IProductionFactory wuhanFactory = new WuhanFactory();
IProductionFactory nanjingFactory = new NanjingFactory();
IProductionFactory changshaFactory = new ChangshaFactory();
ProductionDelegate wuhanproduction1 = wuhanFactory.ProduceDuckNeck;
ProductionDelegate wuhanproduction2 = wuhanFactory.ProduceDuckWing;
ProductionDelegate nanjingproduction1 = nanjingFactory.ProduceDuckNeck;
ProductionDelegate nanjingproduction2 = nanjingFactory.ProduceDuckWing;
ProductionDelegate changshaproduction1 = changshaFactory.ProduceDuckNeck;
ProductionDelegate changshaproduction2 = changshaFactory.ProduceDuckWing;
Console.WriteLine("武汉工厂的产品生产情况:\n");
Console.WriteLine(wuhanproduction1() + ';' + wuhanproduction2() + '\n');
Console.WriteLine("南京工厂的产品生产情况:\n");
Console.WriteLine(nanjingproduction1() + ';' + nanjingproduction2() + '\n');
Console.WriteLine("长沙工厂的产品生产情况:\n");
Console.WriteLine(changshaproduction1() + ';' + changshaproduction2() + '\n');
}
}
}