一,作业内容
使用 C# 编码(涉及类、接口、委托等关键知识点),实现对周黑鸭工厂的产品生产统一管理,主要产品包括鸭脖和鸭翅。武汉工厂能生生产鸭脖和鸭翅,南京工厂只能生产鸭翅,长沙工厂只能生产鸭脖。具体要求如下:
- 定义接口 IProductionFactory,包含生产鸭脖和鸭翅的方法。
- 定义类 WuhanFactory、NanjingFactory、ChangshaFactory 分别实现接口 IProductionFactory,用于具体的生产工厂。
- 使用委托 ProductionDelegate 定义生产委托。
- 在 Main 函数中,创建不同工厂的实例,并通过生产委托进行生产
二,代码实现
1,定义接口
接口的定义:接口使用interface关键字来定义,后面跟着接口的名称。接口名称通常遵循PascalCasing的命名约定。
接口的成员:接口可以包含以下几种类型的成员:方法,属性,事件,索引器。
interface IMyInterface
{
void ProduceDuckNecks();
void ProduceDuckWings();// 方法成员声明
}
2,定义类
类的定义:类使用class
关键字定义,后面跟着类名。类名通常遵循PascalCasing(首字母大写,每个单词的首字母也大写)的命名约定。
类的成员:类可以包含以下类型的成员:
字段:存储数据。
属性:提供字段的访问和修改。
方法:执行特定的操作。
事件:通知其他对象当某些特殊事情发生时。
嵌套类:在类内部定义的类。
常量:表示不可变的值。
索引器:允许对象像数组一样进行索引。
运算符重载:为自定义类型定义运算符的行为。
构造函数和析构函数:用于对象的初始化和清理。
WuhanFactory
class NanJingFactory : IProductionFactory:这里声明了一个名为 NanJingFactory 的类,并指定它实现了 IProductionFactory 接口。这意味着 NanJingFactory 类必须提供 IProductionFactory 接口中声明的所有方法的具体实现。
class WuhanFactory : IProductionFactory
{
public void ProduceDuckNecks()
{
System.Console.WriteLine("Wuhan factory is producing duck necks.");
}
public void ProduceDuckWings()
{
System.Console.WriteLine("Wuhan factory is producing duck wings.");
}
}
NanjingFactory
public void CreateYaChi():使用 throw 关键字抛出了一个 NotImplementedException 异常。异常信息为“Error: Nanjing factory cannot produce duck necks!”,这表示长沙工厂并不具备生产鸭翅的能力,如果调用这个方法,程序会抛出异常并停止执行。
class NanjingFactory : IProductionFactory
{
public void ProduceDuckNecks()
{
throw new NotImplementedException("Error: Nanjing factory cannot produce duck necks!");
}
public void ProduceDuckWings()
{
System.Console.WriteLine("Nanjing factory is producing duck wings.");
}
}
ChangshaFactory
class ChangshaFactory : IProductionFactory
{
public void ProduceDuckWings()
{
throw new NotImplementedException("Error: Changsha factory cannot produce duck wings!");
}
public void ProduceDuckNecks()
{
System.Console.WriteLine("Changsha factory is producing duck necks.");
}
}
3,定义委托
这里定义了一个名为 ProductionDelegate
的委托,它接受一个 string
类型的参数 productName
,没有返回值。委托是C#中的一种类型,它安全地封装了方法的签名和引用,可以将方法作为参数传递或者赋值给变量。
// 定义生产委托
public delegate void ProductionDelegate();
4,主函数main
internal class Program
{
public static void FactoryProduct(ProductionDelegate productionDelegate)
{
// 如果委托无误,正常调用
try
{
productionDelegate();
}
// 如果捕获到异常,则输出错误信息
catch (NotImplementedException e)
{
System.Console.WriteLine(e.Message);
}
}
private static void Main(string[] args)
{
// 创建工厂实例
IProductionFactory wuhanFactory, nanjingFactory, changshaFactory;
wuhanFactory = new WuhanFactory();
nanjingFactory = new NanjingFactory();
changshaFactory = new ChangshaFactory();
// 实现委托
ProductionDelegate wuhanDelegate, nanjingDelegate, changshaDelegate;
// 武汉
wuhanDelegate = wuhanFactory.ProduceDuckNecks;
wuhanDelegate += wuhanFactory.ProduceDuckWings;
// 南京
nanjingDelegate = nanjingFactory.ProduceDuckWings;
// 长沙
changshaDelegate = changshaFactory.ProduceDuckNecks;
// 通过委托进行生产
FactoryProduct(wuhanDelegate);
FactoryProduct(nanjingDelegate);
FactoryProduct(changshaDelegate);
}
}
在上述代码中,我们定义了 ProductionDelegate
委托,并创建了三个实现 IProductionFactory
接口的工厂类。在 Main
函数中,我们创建了工厂实例,并创建了生产委托的实例,然后通过委托实例调用了生产方法。我们还提供了一个辅助方法 ProduceByFactory
来根据工厂实例和产品名称进行生产,该方法可以处理不支持的产品类型情况。
请注意,根据题目要求,如果某个工厂不支持生产某种产品,我们应该在工厂的方法实现中抛出 NotSupportedException
异常。在 Main
函数的 ProduceByFactory
方法中,我们没有显式处理这种异常,因为在这个简单的例子中,我们假设工厂有能力生产请求的产品。在实际应用中,应该添加适当的异常处理逻辑来确保程序的健壮性。
三,测试结果
四,实验难点
-
接口与实现的匹配:确保每个工厂类都正确地实现了接口中定义的方法。例如,南京工厂和长沙工厂应该只实现它们能够生产的产品的方法,并抛出异常或返回错误消息来表明它们不能生产其他产品。
-
委托的使用:理解委托如何作为方法指针工作,以及如何将对象实例作为参数传递给委托调用的方法。在本例中,
ProductionDelegate
委托用于调用工厂实例的生产方法。 -
错误处理:当工厂不支持生产某种产品时,需要适当地处理这种情况。这可以通过抛出异常、返回错误码或提供默认行为来实现。在本例中,我们选择了抛出
NotImplementedException
异常。 -
代码的健壮性和可维护性:设计工厂类时,需要考虑代码的扩展性和可维护性。如果将来需要添加新的产品类型或工厂,代码应该能够轻松地适应这些变化。