一、题目
使用 C# 编码(涉及类、接口、委托等关键知识点),实现对周黑鸭工厂的产品生产统一管理,主要产品包括鸭脖和鸭翅。武汉工厂能生生产鸭脖和鸭翅,南京工厂只能生产鸭翅,长沙工厂只能生产鸭脖。具体要求如下:
- 定义接口 IProductionFactory,包含生产鸭脖和鸭翅的方法。
- 定义类 WuhanFactory、NanjingFactory、ChangshaFactory 分别实现接口 IProductionFactory,用于具体的生产工厂。
- 使用委托 ProductionDelegate 定义生产委托。
- 在 Main 函数中,创建不同工厂的实例,并通过生产委托进行生产。
二、知识点
(ps:具体知识点的学习可以看我的其他博客,应该写了)
2.1接口(Interface)
C#中的接口是一种定义了一组方法的契约或规范,但不提供这些方法的具体实现。此题中接口的作用是为类定义了一个应该遵循的规范或契约。任何实现该接口的类都必须提供接口中定义的所有方法的实现。这有助于确保类之间的一致性,并使得代码更加可预测和可维护。
2.2委托(Delegate)
C# 中的委托是一种类型,它安全地封装了方法的签名和方法的引用。委托特别用于实现回调和事件驱动编程模型。可以直接理解为委托就是定义一件事情任务,比如本题就是“做生产”这件事情。
2.3类
本题就是把做委托这件事的(即被委托人乙方)东西作为类
三、具体步骤
3.1接口定义:IProductionFactory
接口定义了工厂可能会执行的两个方法:ProduceDuckNeck
和ProduceDuckWing
。
public interface IProductionFactory//定义接口
{void ProduceDuckNeck();void ProduceDuckWing();
}
3.2工厂实现:每个工厂类(WuhanFactory
,NanjingFactory
,ChangshaFactory
)都实现了IProductionFactory
接口,并根据具体的生产方法的不同调用不同的接口方法。例如,WuhanFactory
可以生产鸭脖和鸭翅,而NanjingFactory
只能生产鸭翅。
//定义武汉、南京、长沙三个生产工厂
public class WuhanFactory : IProductionFactory
{public void ProduceDuckNeck(){Console.WriteLine("武汉工厂生产鸭脖");}public void ProduceDuckWing(){Console.WriteLine("武汉工厂生产鸭翅");}
}public class NanjingFactory : IProductionFactory
{public void ProduceDuckNeck(){throw new NotSupportedException("南京工厂不能生产鸭脖");}public void ProduceDuckWing(){Console.WriteLine("南京工厂生产鸭翅");}
}public class ChangshaFactory : IProductionFactory
{public void ProduceDuckNeck(){Console.WriteLine("长沙工厂生产鸭脖");Console.ReadLine();}public void ProduceDuckWing(){throw new NotSupportedException("长沙工厂不能生产鸭翅");}
}
3.3委托定义:ProductionDelegate
委托类型用于将工厂对象作为参数,并调用其生产方法。这样,委托可以作为生产方法的引用,从而在不同的工厂上执行相同的操作。
public delegate void ProductionDelegate(IProductionFactory factory);//定义生产委托
委托具体做什么:
// 生产鸭脖的委托方法 static void ProduceDuckNeck(IProductionFactory factory){factory.ProduceDuckNeck();}// 生产鸭翅的委托方法 static void ProduceDuckWing(IProductionFactory factory){factory.ProduceDuckWing();}
3.4异常处理:而对于不做某些接口方法的工厂类(例如南京工厂不支持生产鸭脖),则对应的方法会抛出NotSupportedException
。在调用这些方法时,代码通过try-catch
块捕获并处理这些异常。(本题没有这个要求,这是拓展)
抛出例子:
public void ProduceDuckWing()
{throw new NotSupportedException("长沙工厂不能生产鸭翅");
}
try-catch:
try
{duckneck(nanjingFactory);
}
catch (NotSupportedException ex)
{Console.WriteLine(ex.Message);
}
try
{duckwing(changshaFactory);
}
catch (NotSupportedException ex)
{Console.WriteLine(ex.Message);
}
3.5委托调用:在Main
方法中,委托被用来调用工厂的生产方法。将委托指向不同的工厂对象,而无需修改调用代码,就可以在不同的工厂中选择生产鸭脖或者鸭翅。
// 创建生产委托 ProductionDelegate duckneck = ProduceDuckNeck;ProductionDelegate duckwing = ProduceDuckWing;// 使用委托调用工厂生产鸭脖和鸭翅 duckneck(wuhanFactory);duckwing(wuhanFactory);duckwing(nanjingFactory);duckneck(changshaFactory);
四、完整代码
using System;
namespace ZhouHeiYa
{public interface IProductionFactory//定义接口{void ProduceDuckNeck();void ProduceDuckWing();}//定义武汉、南京、长沙三个生产工厂public class WuhanFactory : IProductionFactory{public void ProduceDuckNeck(){Console.WriteLine("武汉工厂生产鸭脖");}public void ProduceDuckWing(){Console.WriteLine("武汉工厂生产鸭翅");}}public class NanjingFactory : IProductionFactory{public void ProduceDuckNeck(){throw new NotSupportedException("南京工厂不能生产鸭脖");}public void ProduceDuckWing(){Console.WriteLine("南京工厂生产鸭翅");}}public class ChangshaFactory : IProductionFactory{public void ProduceDuckNeck(){Console.WriteLine("长沙工厂生产鸭脖");Console.ReadLine();}public void ProduceDuckWing(){throw new NotSupportedException("长沙工厂不能生产鸭翅");}}public delegate void ProductionDelegate(IProductionFactory factory);//定义生产委托internal class Program{static void Main(string[] args){// 创建不同工厂实例 IProductionFactory wuhanFactory = new WuhanFactory();IProductionFactory nanjingFactory = new NanjingFactory();IProductionFactory changshaFactory = new ChangshaFactory();// 创建生产委托 ProductionDelegate duckneck = ProduceDuckNeck;ProductionDelegate duckwing = ProduceDuckWing;// 使用委托调用工厂生产鸭脖和鸭翅 duckneck(wuhanFactory);duckwing(wuhanFactory);duckwing(nanjingFactory);duckneck(changshaFactory); try{duckneck(nanjingFactory);}catch (NotSupportedException ex){Console.WriteLine(ex.Message);}try{duckwing(changshaFactory);}catch (NotSupportedException ex){Console.WriteLine(ex.Message);}}// 生产鸭脖的委托方法 static void ProduceDuckNeck(IProductionFactory factory){factory.ProduceDuckNeck();}// 生产鸭翅的委托方法 static void ProduceDuckWing(IProductionFactory factory){factory.ProduceDuckWing();}}}