如何更优雅地优化Block集合批量绘制的方法重载实现?
优化批量绘制Block集合的代码方案
最佳方案:使用IEnumerable<Block>作为参数类型
Block[]和List<Block>都实现了IEnumerable<Block>接口,直接用这个接口作为参数类型,就能用单一方法处理所有此类集合,彻底避免重复代码:
public static void DrawAll(IEnumerable<Block> blocks) { foreach(Block b in blocks) b.Draw(); }
这个方案不仅支持数组和List,还能兼容所有实现IEnumerable<Block>的集合类型(比如HashSet<Block>、LinkedList<Block>等),扩展性更强,同时保证类型安全。
泛型约束的替代方案
如果需要保留泛型写法(比如后续要用到具体集合类型的特性),可以给泛型参数添加IEnumerable<Block>约束,让编译器识别集合的可枚举特性和元素类型:
public static void DrawAll<T>(T blocks) where T : IEnumerable<Block> { foreach(Block b in blocks) b.Draw(); }
为什么之前的泛型写法失效
你之前的无约束泛型方法DrawAll<T>(T arr),编译器无法推断T实现了可枚举接口,也无法确认枚举元素是Block类型,因此无法执行遍历和Draw()方法调用。添加泛型约束后,编译器就能明确这些类型信息,代码即可正常编译运行。
内容的提问来源于stack exchange,提问作者kneecapfolder
相关产品推荐
相关产品推荐

