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

DART中如何统一调用多类静态属性与方法(无需if-else)

解决Dart中统一调用同类结构类成员的问题

核心思路

通过抽象类定义统一接口,让所有结构一致的类(如Hotel、Home)实现该接口,这样就可以用抽象类类型作为参数,无需逐个判断具体类型即可调用统一方法。

具体实现步骤

1. 定义抽象接口类

创建一个抽象类,规范所有住宿类必须实现的方法,包括获取价格、获取评分、修改价格:

abstract class Accommodation {
  String getPrice(String name);
  String getRating(String name);
  void updatePrice(String name, String newPrice);
}

2. 让子类实现抽象接口

修改Hotel和Home类,实现Accommodation接口,同时将静态map封装为私有成员,通过接口方法访问:

class Hotel implements Accommodation {
  static final Map<String, List<String>> _mapInformation = {
    'Americana Hotel': [
      '4.3*', 
      '\$4000 / Night', 
    ],
  };

  @override
  String getPrice(String favouriteElementsName) {
    return _mapInformation[favouriteElementsName]?.elementAt(1) ??
        'It may need fixes';
  }

  @override
  String getRating(String favouriteElementsName) {
    return _mapInformation[favouriteElementsName]?.elementAt(0) ??
        'It may need fixes';
  }

  @override
  void updatePrice(String name, String newPrice) {
    _mapInformation[name]?[1] = newPrice;
  }
}

class Home implements Accommodation {
  static final Map<String, List<String>> _mapInformation = {
    'Beachside Resort': [
      '2.2*', 
      '\$2200 / Night', 
    ],
  };

  @override
  String getPrice(String favouriteElementsName) {
    return _mapInformation[favouriteElementsName]?.elementAt(1) ??
        'It may need fixes';
  }

  @override
  String getRating(String favouriteElementsName) {
    return _mapInformation[favouriteElementsName]?.elementAt(0) ??
        'It may need fixes';
  }

  @override
  void updatePrice(String name, String newPrice) {
    _mapInformation[name]?[1] = newPrice;
  }
}

3. 修改Favourite类适配接口

将Favourite中的map类型改为LinkedHashMap<String, Accommodation>,changePrice方法参数改为Accommodation类型,直接调用接口方法:

import 'dart:collection';

class Favourite {
  final LinkedHashMap<String, Accommodation> favouriteElementsInLinkedHashMap =
      LinkedHashMap();

  void changePrice(String favouriteElementKey, Accommodation accommodation) {
    accommodation.updatePrice(favouriteElementKey, '\$5000 / Night');
    var str1 = accommodation.getPrice(favouriteElementKey);
    var str2 = accommodation.getRating(favouriteElementKey);
    // 可添加业务逻辑,比如打印结果
    print('${favouriteElementKey}:新价格${str1},评分${str2}');
  }
}

void main() {
  var fav = Favourite();
  // 存入类的实例而非类本身
  fav.favouriteElementsInLinkedHashMap['Americana Hotel'] = Hotel();
  fav.favouriteElementsInLinkedHashMap['Beachside Resort'] = Home();

  for (var entry in fav.favouriteElementsInLinkedHashMap.entries) {
    fav.changePrice(entry.key, entry.value);
  }
}

关键说明

  • 原代码报错原因:Object类型没有mapInformation、getPrice等成员,Dart作为强类型语言,必须明确类型才能调用成员。
  • 抽象类的作用:统一所有同类结构类的方法签名,实现多态调用,避免大量if-else类型判断。
  • 封装静态数据:将原来的公开静态map改为私有,通过接口方法操作,符合封装原则,避免直接暴露内部数据。

内容的提问来源于stack exchange,提问作者Elmar

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.02 13:14:52