C#利用范型与扩展方法重构代码

王朝学院·作者佚名  2016-08-27
窄屏简体版  字體: 小  |  中  |  大  |  超大  

在一些C#代码中常常可以看到

java代码

//An Simple Example By Ray Linn class CarCollection :ICollection { IList list; public void Add(Car car) { list.Add(car); } .... function list for ICollection... public void listPRice() { foreach(Car car in list) System.Console.WriteLin(car.Price); } ......more specifical function list... } class PetCollection :ICollection { IList list; public void Add(Pet pet) { list.Add(pet); } .... function list for ICollection... public void FeedPet() { foreach(Pet pet in list) System.Console.WriteLin(pet.Eating()); } ......more specifical function list... }

这样的代码在很多Open Source项目中是很经常看到的,比如Cecil,其共同特点是:某种特定类型的Collection+该Collection特殊的操作,在一个项目中可能充斥着数十个类似的Collection,类似的代码在Java中很难被重构,但是在C#中,却可以借助扩展方法与范型进行代码的精减。

首先创建范型的Collection,该例子可以用List<T>来代替,但作为例子,我们假设该List<T>是特殊的(可能有一些delegate)

Java代码

Java代码

public CommonCollection<T>:ICollection<T> { IList<T> list .... function list for ICollection... } public CommonCollection<T>:ICollection<T> { IList<T> list .... function list for ICollection... }

对于Car和Pet的特殊操作,我们通过扩展方法来实现

Java代码

public static class CarExt { //Ext Function For CommonCollection<Car> by Ray Linn public static void listPrice(this CommonCollection<Car> collection) { foreach(Car car in collection) System.Console.WriteLin(car.Price); } ......more specifical function list... } public static class PetExt { //Ext Function For CommonCollection<Pet> by Ray Linn public static void FeedPet(this CommonCollection<Pet> collection) { foreach(Pet pet in list) System.Console.WriteLin(pet.Eating()); } }

通过这样的方式,我们就实现了重构,两个Collection实现了求同存异。在我重构的Cecil之后,编译后的Assemly大小减小了一半.

 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
 
© 2005- 王朝網路 版權所有 導航