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
相关产品推荐
相关产品推荐

