目标:
使用 C# 编码(涉及类、接口、委托等关键知识点),实现对周黑鸭工厂的产品生产统一管理,主要产品包括鸭脖和鸭翅。武汉工厂能生生产鸭脖和鸭翅,南京工厂只能生产鸭翅,长沙工厂只能生产鸭脖。具体要求如下:
- 定义接口 IProductionFactory,包含生产鸭脖和鸭翅的方法。
- 定义类 WuhanFactory、NanjingFactory、ChangshaFactory 分别实现接口 IProductionFactory,用于具体的生产工厂。
- 使用委托 ProductionDelegate 定义生产委托。
- 在 Main 函数中,创建不同工厂的实例,并通过生产委托进行生产。
分析问题及难点:
此题给的要求非常具体,按照要求步骤来编写代码便可以达到目的。
难点在于理解并会运用类、接口、委托等知识点并编写出简便的代码,以及处理NotImplementedException异常。
具体实现:
一、首先,先定义接口,它包含了制作鸭脖和鸭翅的方法:
1.1接口的定义
接口(Interface)是一种引用类型,它定义了一组方法的契约,这些方法必须由实现该接口的类或结构提供。具体的实现接口不能被实例化,它们只是定义了一组方法的签名,而具体的实现则由实现该接口的类或结构来完成。
1.2使用接口的好处
接口的主要优点在于它们提供了抽象层,使得代码更加灵活和可维护。通过使用接口,我们可以编写与接口而不是具体类交互的代码,从而更容易地替换实现细节。此外,接口还支持多重继承,即一个类可以实现多个接口,从而组合多个不同的行为。
此题通过实现相同的接口,不同的类可以共享相同的行为。这减少了重复代码的需要,提高了代码复用性。
1.3注意事项
(1)接口成员访问权限为public,但不能加访问修饰符
(2)接口成员不能有定义
(3)接口的成员必须是方法,属性,事件或索引器,不能包含常数、字段、运算符、实例构造函数、析构函数或类型。
1.4代码实现
//定义生产接口
public interface IProductionFactory
{
void produceduckneck();
void produceduckwings();
}
二、然后定义三个类并分别实现接口 IProductionFactory,并具体实现生产鸭脖和鸭翅的逻辑:
2.1类的定义
类(Class)是一种用户定义的数据类型,它允许你创建自己的对象。类可以包含字段(变量)、属性、方法、事件等。字段是类的数据成员,存储类的状态信息;方法是类的行为,描述类可以执行v
2.2代码实现
//定义武汉工厂并实现接口
public class WuhanFactory : IProductionFactory
{
public void produceduckneck() { Console.WriteLine("武汉工厂生产了鸭脖。"); }
public void produceduckwings() { Console.WriteLine("武汉工厂生产了鸭翅。"); }
}
//定义南京工厂并实现接口
public class NanjingFactory : IProductionFactory
{
public void produceduckneck() { throw new NotImplementedException("南京工厂不能生产鸭脖。");
//Console.WriteLine("南京工厂不能生产鸭脖。");}
public void produceduckwings() { Console.WriteLine("南京工厂生产了鸭翅。"); }
}
//定义长沙工厂并实现接口
public class ChangshaFactory : IProductionFactory
{
public void produceduckneck() { Console.WriteLine("长沙工厂生产了鸭脖。"); }
public void produceduckwings() { throw new NotImplementedException("长沙工厂不能生产鸭翅。");
//Console.WriteLine("长沙工厂不能生产鸭翅。");}
}
2.3注意事项
在此代码中,我运用了NotImplementedException异常处理,虽然在此题中,可以直接运用与前面一致的Console.Writeline()语句,但在实际生产中,在这里运用NotImplementedException异常处理有很多好处:
(1)易于调试和错误追踪:当程序运行时遇到NotImplementedException
,开发者可以立即知道问题所在,并直接定位到需要实现的代码部分。这有助于快速定位和修复问题,提高开发效率。
(2)遵守契约:在接口编程中,实现类必须提供接口中所有方法的实现。如果一个方法暂时无法提供实现,使用NotImplementedException
可以确保类的实现仍然满足接口的契约,而不会导致编译错误。
(3)避免误导:如果不实现一个方法而只是返回一个默认值或执行一些无关的操作,这可能会误导调用者认为该方法已经按预期工作。使用NotImplementedException
可以确保调用者意识到该方法尚未完成。
三、定义委托,表示生产行为:
3.1委托
委托是一种可以指向方法的引用,可以理解为一种函数指针,是类型安全的。它类似于C++使用中的函数指针通过对于方法特征和返回值类型的声明封装了具有相同特征和返回类型的方法。
委托需要三个步骤:
(1)声明委托类型
(2)创建委托实例
(3)向委托实例注册方法
3.2代码实现
//声明委托类型
public delegate void ProductionDelegate();
四、在 Main 函数中,创建不同工厂的实例,并通过生产委托进行生产:
4.1首先,创建不同工厂实例:
IProductionFactory wuhanFactory = new WuhanFactory();
IProductionFactory nanjingFactory = new NanjingFactory();
IProductionFactory changshaFactory = new ChangshaFactory();
4.2然后,定义生产并绑定委托方法:
ProductionDelegate produceDuckNeckDelegate = wuhanFactory.produceduckneck;
ProductionDelegate produceDuckWingsDelegate = nanjingFactory.produceduckwings;
4.3委托生产
produceDuckNeckDelegate = changshaFactory.produceduckneck;
produceDuckNeckDelegate();
produceDuckWingsDelegate = nanjingFactory.produceduckneck;
produceDuckWingsDelegate();
produceDuckWingsDelegate = wuhanFactory.produceduckwings;
produceDuckWingsDelegate();
但是,在这个委托生产中,南京工厂是不可以生产鸭脖的,结果会显示NotImplementedException异常,并不执行异常后的语句。
运行结果如下:
因此,这里应该对NotImplementedException异常进行处理。我这里运用的是try-catch来处理异常:
try
{
produceDuckNeckDelegate = changshaFactory.produceduckneck;
produceDuckNeckDelegate();
}
catch ( Exception ex)
{ Console.WriteLine("捕获到未知异常: " + ex.Message); }
try
{
produceDuckWingsDelegate = nanjingFactory.produceduckneck;
produceDuckWingsDelegate();
}
catch (Exception ex)
{ Console.WriteLine("捕获到未知异常: " + ex.Message); }
try
{
produceDuckWingsDelegate = wuhanFactory.produceduckwings;
produceDuckWingsDelegate();
}
catch (Exception ex)
{ Console.WriteLine("捕获到未知异常: " + ex.Message); }
运行结果如下:
综上所述,全部代码为:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace ConsoleApp10
{
public interface IProductionFactory
{
void produceduckneck();
void produceduckwings();
}
public class WuhanFactory : IProductionFactory
{
public void produceduckneck() { Console.WriteLine("武汉工厂生产了鸭脖。"); }
public void produceduckwings() { Console.WriteLine("武汉工厂生产了鸭翅。"); }
}
public class NanjingFactory : IProductionFactory
{
public void produceduckneck() { throw new NotImplementedException("南京工厂不能生产鸭脖。"); }
public void produceduckwings() { Console.WriteLine("南京工厂生产了鸭翅。"); }
}
public class ChangshaFactory : IProductionFactory
{
public void produceduckneck() { Console.WriteLine("长沙工厂生产了鸭脖。"); }
public void produceduckwings() { throw new NotImplementedException("长沙工厂不能生产鸭翅。"); }
}
public delegate void ProductionDelegate();
internal class Program
{
static void Main(string[] args)
{
IProductionFactory wuhanFactory = new WuhanFactory();
IProductionFactory nanjingFactory = new NanjingFactory();
IProductionFactory changshaFactory = new ChangshaFactory();
ProductionDelegate produceDuckNeckDelegate = wuhanFactory.produceduckneck;
ProductionDelegate produceDuckWingsDelegate = nanjingFactory.produceduckwings;
try
{
produceDuckNeckDelegate = changshaFactory.produceduckneck;
produceDuckNeckDelegate();
}
catch ( Exception ex)
{ Console.WriteLine("捕获到未知异常: " + ex.Message); }
try
{
produceDuckWingsDelegate = nanjingFactory.produceduckneck;
produceDuckWingsDelegate();
}
catch (Exception ex)
{ Console.WriteLine("捕获到未知异常: " + ex.Message); }
try
{
produceDuckWingsDelegate = wuhanFactory.produceduckwings;
produceDuckWingsDelegate(); }
catch (Exception ex)
{ Console.WriteLine("捕获到未知异常: " + ex.Message); }
}
}
}