Dart中如何重构不同返回类型的相似函数?
重构重复函数的两种可行方案
完全可以重构这些逻辑重复的函数,不用List<dynamic>(它会丢失类型安全),用Dart的泛型特性就能优雅解决,给你两种实用方案:
方案一:定义统一接口(适合可修改原有类的场景)
先定义一个包含name属性的抽象接口,让你的A、B类实现它:
abstract class HasName { String get name; } // 修改A类实现HasName class A implements HasName { final String code; @override final String name; A({required this.code, required this.name}); } // 修改B类实现HasName class B implements HasName { @override final String name; final String leaveDate; B({required this.name, required this.leaveDate}); }
然后写一个带类型约束的泛型函数,复用过滤逻辑:
List<T> filterByName<T extends HasName>(String value, List<T> list) { final lowerCaseValue = value.toLowerCase(); // 用where+toList简化循环代码 return list.where((item) => item.name.toLowerCase().contains(lowerCaseValue)).toList(); }
使用时直接传入对应类型的列表,返回值会自动推导为对应类型:
List<A> filteredA = filterByName("test", listOfA); List<B> filteredB = filterByName("test", listOfB);
方案二:传递属性提取函数(适合无法修改原有类的场景)
如果不能改动A、B的代码,就用匿名函数传递提取name的逻辑,泛型函数更灵活:
List<T> filterByProperty<T>(String value, List<T> list, String Function(T) getProperty) { final lowerCaseValue = value.toLowerCase(); return list.where((item) => getProperty(item).toLowerCase().contains(lowerCaseValue)).toList(); }
使用时指定如何从对象中获取要匹配的属性:
// 过滤A类列表 List<A> filteredA = filterByProperty("test", listOfA, (a) => a.name); // 过滤B类列表 List<B> filteredB = filterByProperty("test", listOfB, (b) => b.name);
两种方案都能彻底消除代码冗余,同时保留完整的类型安全,比用dynamic靠谱得多。
内容的提问来源于stack exchange,提问作者Leong
相关产品推荐
相关产品推荐

