Dart中如何实现抽象类的实例化?
Dart 抽象类实例化的实现方式
首先明确基础规则:正常 Dart 语法中,被abstract修饰的抽象类无法通过普通new关键字直接实例化。你观察到的int、String、List等抽象类可以直接获取实例,是Dart提供了针对性的实现支持,核心分为两种场景:
1. 内置核心类型的特殊语法支持
你举的几个例子都属于Dart内置核心类型,这类抽象类的实例化能力是Dart编译器和SDK底层做的特殊处理:
- 这些抽象类对外只暴露接口定义,底层对应了SDK内部未公开的具体实现子类,比如
int对应的小整数实现_Smi、大整数实现_Mint,List对应的可增长列表实现_GrowableList等,所有内部子类都继承自对应的公开抽象类 - Dart为这些类型提供了专属字面量语法,你写
int a = 5、List<int> myList1 = [50,60,70]的时候,编译器会自动把字面量映射到底层的具体子类实例,对外完全隐藏实现细节
这种内置的字面量实例化能力是Dart编译器专属支持的,普通开发者无法为自定义类新增自定义字面量语法。
2. 自定义抽象类通过工厂构造函数模拟实例化
如果要给自定义抽象类实现类似的「直接调用类名获取实例」的效果,可以用Dart的factory工厂构造函数,在构造逻辑中返回抽象类的具体子类实例即可,示例代码如下:
// 定义抽象类 abstract class Animal { final String name; // 工厂构造函数,返回具体子类实例 factory Animal(String type, String name) { if (type == 'cat') return Cat(name); if (type == 'dog') return Dog(name); throw ArgumentError('不支持的动物类型'); } // 抽象方法 void makeSound(); } // 具体实现子类 class Cat implements Animal { @override final String name; Cat(this.name); @override void makeSound() => print('$name 喵喵叫'); } class Dog implements Animal { @override final String name; Dog(this.name); @override void makeSound() => print('$name 汪汪叫'); } void main() { // 调用时看起来和直接实例化抽象类完全一致 Animal cat = Animal('cat', '橘猫'); cat.makeSound(); // 输出:橘猫 喵喵叫 }
- 工厂构造函数还支持返回缓存实例、单例实例等逻辑,灵活性很高
- 本质上没有直接实例化抽象类,只是通过工厂构造屏蔽了底层子类的实现细节,对外只暴露抽象类的接口,使用体验和直接实例化抽象类一致
内容的提问来源于stack exchange,提问作者a.rah
相关产品推荐
相关产品推荐

