做酒店网站的公司,wordpress设置描述词,wordpress修改上传附件大小,洛阳做网站公司地址任务目标
实现对周黑鸭工厂的产品生产统一管理#xff0c;主要产品包括鸭脖和鸭翅。武汉工厂能生生产鸭脖和鸭翅#xff0c;南京工厂只能生产鸭翅#xff0c;长沙工厂只能生产鸭脖。
分析任务
我们需要有武汉工厂、南京工厂、长沙工厂的类#xff0c;类中需要实现生产鸭…任务目标
实现对周黑鸭工厂的产品生产统一管理主要产品包括鸭脖和鸭翅。武汉工厂能生生产鸭脖和鸭翅南京工厂只能生产鸭翅长沙工厂只能生产鸭脖。
分析任务
我们需要有武汉工厂、南京工厂、长沙工厂的类类中需要实现生产鸭肉的函数既然都有这个生产鸭肉的函数我们就可以用接口来限定它。 我们还需要在周黑鸭总部下达生产的命令后各个工厂都开始生产各自的产品那么怎么做到让这些函数同时被执行呢这时我们可以用委托。
前置任务
掌握c#接口和委托的使用
一、接口
在C#中接口interface是一种定义了一套方法和属性但不包含实现的类型。接口规定了一个类必须实现哪些方法和属性但它不定义这些方法和属性的具体执行内容。接口是抽象类型不能被实例化。它们通常用于定义对象之间的协议或为不同类提供一个公共的功能接口。
例如
// 定义一个接口
public interface IAnimal
{ void Eat(); void Sleep();
} // 一个类实现该接口
public class Dog : IAnimal
{ public void Eat() { Console.WriteLine(Dog is eating.);} public void Sleep() { Console.WriteLine(Dog is sleeping.); }
} Dog类在继承了接口IAnimal接口后必须对其方法进行实现。 定义契约和行为 接口定义了一组方法、属性、事件或其他成员的契约任何实现该接口的类都必须遵循这些约定。这确保了所有实现该接口的类都具有一致的行为和特征。 解耦和抽象 接口允许我们将类与其具体实现分离从而实现更高级别的抽象。这使得代码更加模块化易于维护和扩展。通过将实现细节隐藏在接口后面我们可以降低类之间的耦合度提高代码的可重用性。 多态性支持 通过接口我们可以创建引用不同类型对象的变量只要这些类型都实现了相同的接口。这使得我们可以在不修改现有代码的情况下将不同的类互换使用。多态性不仅提高了代码的灵活性还使得程序更加易于扩展和修改。 多重继承的一种形式 虽然C#不支持类的多重继承即一个类不能继承自多个基类但接口允许实现多重继承的效果。一个类可以实现多个接口从而继承多个接口中的方法、属性等成员。这有助于组合不同的功能集实现更复杂的业务逻辑。 插件式架构和框架设计 接口在构建插件式架构和框架时非常有用。通过定义一系列接口我们可以允许第三方开发者创建自己的实现并将其集成到我们的系统中。这种灵活性使得框架更加开放和可扩展。 代码清晰和可读性 使用接口可以使代码更加清晰和易于理解。通过将相关的方法组织到接口中我们可以更好地描述类的职责和功能。此外接口还可以作为文档的一部分帮助其他开发者理解如何使用我们的类和方法。 版本控制和兼容性 当需要修改现有类的行为时如果该类实现了接口我们可以创建一个新的类来实现相同的接口并在需要时替换旧类。这样我们可以保持与现有代码的兼容性同时引入新的功能或修改现有功能。
关于本题我们可以定义一个IProductionFactory 接口类里面设置生产方法然后让所有的工厂类去继承这个接口并实现其生产方法
二、委托
委托delegate在C#编程中是一种特殊的类型它表示对具有特定参数列表和返回类型的方法的引用。委托的主要用途是将方法作为参数传递给其他方法或者异步地调用方法。通过使用委托可以实现回调函数、事件处理、异步编程等多种功能。
具体来说委托定义了一种方法的签名并且可以与具有相同签名的方法相关联。一旦委托与某个方法关联委托就可以被用来调用该方法就好像委托本身就是一个方法一样。这使得在运行时动态地改变方法的调用成为可能。
委托用作回调函数来使 首先定义一个委托类型它接受一个整数数组和一个整数索引用于返回最大数的位置并返回最大数
public delegate int FindMaxDelegate(int[] numbers, out int maxIndex);然后创建几个实现这个委托的方法。这些方法将按照不同的逻辑来查找最大数
public class MaxFinder
{ // 查找数组中的最大数线性搜索 public static int FindMaxLinear(int[] numbers, out int maxIndex) { int max numbers[0]; maxIndex 0; for (int i 1; i numbers.Length; i) { if (numbers[i] max) { max numbers[i]; maxIndex i; } } return max; } // 另一个方法可能使用更高效的算法这里只是为了演示 // 注意这个示例方法并没有比线性搜索更高效只是为了演示多个实现 public static int FindMaxDummy(int[] numbers, out int maxIndex) { // 假设这里有一个更复杂的算法来找到最大数... // 但为了简单起见我们只是返回第一个元素 maxIndex 0; return numbers[0]; }
}现在你可以创建一个方法它接受一个整数数组和一个FindMaxDelegate委托作为参数并使用这个委托来查找最大数
public class Program
{ static void Main(string[] args) { int[] numbers { 1, 3, 7, 2, 9, 5 }; FindMaxDelegate findMaxDelegate MaxFinder.FindMaxLinear; // 使用线性搜索方法 // 使用委托来查找最大数 int max FindMaxUsingDelegate(numbers, findMaxDelegate); int maxIndex; findMaxDelegate(numbers, out maxIndex); // 也可以直接使用委托获取最大数的索引 Console.WriteLine(Max number is: max); Console.WriteLine(Max number index is: maxIndex); } static int FindMaxUsingDelegate(int[] numbers, FindMaxDelegate findMax) { int maxIndex; return findMax(numbers, out maxIndex); }
}程序将输出 Max number is: 9 Max number index is: 4
委托用于多播调用 什么是多播调用 委托可以添加多个函数地址当调用委托时这些函数都会被执行 但是如果函数有返回值那么委托只会返回最后一个被添加进委托的函数的返回值
例如我们可以实现一个计算器委托
delegate T CalculateT(T x,T y);注委托是实现成泛型模板的 建一个数学类里面有加减两种方法 class Math{public int add(int x, int y) { return x y; }public int sub(int x, int y) { return x - y; }}将add和sub添加进委托中调用委托 internal class Program{static void Main(string[] args){Math math new Math();Calculateint cal math.add;cal math.sub;Console.WriteLine(cal(1, 2).ToString());}}通过调试可以知道在调用委托后add和sub都被执行了 但是显示在终端的只有 -1 即sub的返回值因为sub是最后被添加进委托的。
三、完成任务
有了前面这些知识我们便可以实现生产周黑鸭的功能了。
定义生产接口
public interface IProductionFactory
{//其他函数...void produce();
}定义工厂类并实现生产方法
public class WuhanFactory : IProductionFactory
{public void produce(){//具体方法...Console.WriteLine(生产鸭脖和鸭翅);}
}
public class NanjingFactory : IProductionFactory
{public void produce(){//具体方法...Console.WriteLine(生产鸭翅);}
}
public class ChangshaFactory : IProductionFactory
{public void produce(){//具体方法...Console.WriteLine(生产鸭脖);}
}定义委托 delegate void ProductionDelegate();实例化各个工厂并加其生产方法添加进委托调用委托即可实现让所有工厂生产。 static void Main(string[] args){WuhanFactory factory1 new WuhanFactory();NanjingFactory factory2 new NanjingFactory();ChangshaFactory factory3 new ChangshaFactory();ProductionDelegate produce factory1.produce;produce factory2.produce;produce factory3.produce;produce(); }