作业内容
使用 C# 编码(涉及类、接口、委托等关键知识点),实现对周黑鸭工厂的产品生产统一管理,主要产品包括鸭脖和鸭翅。武汉工厂能生生产鸭脖和鸭翅,南京工厂只能生产鸭翅,长沙工厂只能生产鸭脖。具体要求如下:
定义接口 IProductionFactory
,包含生产鸭脖和鸭翅的方法。
定义类 WuhanFactory
、NanjingFactory
、ChangshaFactory
分别实现接口IProductionFactory
,用于具体的生产工厂。
使用委托 ProductionDelegate
定义生产委托。
在 Main
函数中,创建不同工厂的实例,并通过生产委托进行生产
代码解析
C#与C++在OOP方面最大的不同在于C#多了接口、委托与事件等等。
接口
什么是接口?
微软自己的解释是:“接口包含非抽象class
或struct
必须实现的一组相关功能的定义。”
也就是说接口是指定一组函数成员而不实现它们的引用类型。那么这样子在多个类里面都可以使用接口里面所定义的方法,且对象的引用能自动转换为它们实现的接口的引用。
再通俗点就是写一组方法但是不实现他们,在后面的类实现里面调用接口再来实现这些方法
接口使用interface
关键字,模板如下
interface IJie_Kou
{//约定俗成委托的名字的第一个字母为大写的I
void Han_Shu();
}
class A:IJie_Kou
{
void Han_Shu();
{
//具体实现
}
}
class B:IJie_Kou
{
void Han_Shu();
{
//具体实现
}
}
需要注意的是:如果类实现了接口,它必须实现接口的所有成员。同时,如果类派生自基类并实现了接口,基类列表中的基类名称必须放在所有接口之前。
根据上面的内容我们可以写出我们的生产接口:
interface IProductionFactory
{
void Produce_Duck_Neck();//鸭脖
void Produce_Duck_Wing();//鸭翅
}
然后我们在接下来三个城市工厂的类里面实现它们:
public class WuhanFactory : IProductionFactory
{//武汉工厂能生生产鸭脖和鸭翅
public void Produce_Duck_Neck()
{
Console.WriteLine("武汉工厂可以生产鸭脖。");
}
public void Produce_Duck_Wing()
{
Console.WriteLine("武汉工厂可以生产鸭翅。");
}
}
public class NanjingFactory : IProductionFactory
{//南京工厂只能生产鸭翅
public void Produce_Duck_Neck()
{
Console.WriteLine("南京工厂不能生产鸭脖。");
}
public void Produce_Duck_Wing()
{
Console.WriteLine("南京工厂只能生产鸭翅。");
}
}
public class ChangshaFactory : IProductionFactory
{//长沙工厂只能生产鸭脖
public void Produce_Duck_Neck()
{
Console.WriteLine("长沙工厂只能生产鸭脖。");
}
public void Produce_Duck_Wing()
{
Console.WriteLine("长沙工厂不能生产鸭翅。");
}
不过上面不能生产的部分也可以用异常抛出来实现,即:
throw new NotSupportedException("不能生产...");
当调用的方法不受支持时,或者当尝试读取、搜索或写入不支持所调用功能的流时引发的异常就可以用NotSupportedException
类,其继承自SystemException
类。
委托
什么是委托?
微软自己的解释是:“委托提供后期绑定机制。 后期绑定意味着调用方在你所创建的算法中至少提供一个方法来实现算法的一部分。”
这么看是非常抽象的,不过我们可以类比C++里面的函数指针。可以认为委托是持有一个或多个方法的对象。而执行委托时会执行它所“持有”的方法。
委托声明看上去和方法声明相似,只是没有实现块。需要注意的是委托本质上是类型声明。
委托使用 delegate
关键字,模版如下
public delegate void Wei_Tuo(); // 委托声明
class Program
{
static void MethodName()
{
Console.WriteLine("Hello from MethodName!");
}
static void Main(string[] args)
{
Wei_Tuo W; // 声明委托变量
W = new Wei_Tuo(MethodName); // 给委托变量赋值
W(); // 调用委托,委托会执行所引用的方法
}
}
这样我们就可以用W()
来调用方法。
根据上面的内容我们可以声明委托:
delegate void ProductionDelegate();//委托
然后在主函数内声明委托变量并赋值:
//创建三个城市工厂的实例
WuhanFactory wuhanFactory = new WuhanFactory();
NanjingFactory nanjingFactory = new NanjingFactory();
ChangshaFactory changshaFactory = new ChangshaFactory();
//给委托赋值
ProductionDelegate productionDelegate1 = new ProductionDelegate(wuhanFactory.Produce_Duck_Neck);
ProductionDelegate productionDelegate2 = new ProductionDelegate(wuhanFactory.Produce_Duck_Wing);
ProductionDelegate productionDelegate3 = new ProductionDelegate(nanjingFactory.Produce_Duck_Neck);
ProductionDelegate productionDelegate4 = new ProductionDelegate(nanjingFactory.Produce_Duck_Wing);
ProductionDelegate productionDelegate5 = new ProductionDelegate(changshaFactory.Produce_Duck_Neck);
ProductionDelegate productionDelegate6 = new ProductionDelegate(changshaFactory.Produce_Duck_Wing);
最后我们可以直接调用委托来进行生产
//调用委托进行生产
Console.WriteLine("武汉工厂:");
productionDelegate1();
productionDelegate2();
Console.WriteLine("南京工厂:");
productionDelegate3();
productionDelegate4();
Console.WriteLine("长沙工厂:");
productionDelegate5();
productionDelegate6();
运行结果
完整代码仓库:
请点这里
参考
《Illustrated C# 7, Fifth Edition》 By Daniel M. Solis
Illustrated C# 2012 and Illustrated WPF