You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.02 04:30:06