前言
这篇文章,探索了Dart语言的OOP,将会学习类和类之间的关系,像inheritance和abstract classes,并且通过每步学习最终创建成一个很好的结构化的CLI 库
任务
学完这篇文章,你将会建成一个可以理解如下指令的CLI 类库
dartpedia help --verbose --command=search
dartpedia:这个是你构建的应用的可执行文件,名字叫dartpedia
help: 这是一个指令
--verbose: 这是一个flag,可以修改指令的行为
--command=search: 这是一个option
步骤一 定义参数层次结构
首先,你将会定义一个Argument class,一个Option class、一个Command class,并且建立他们之间的继承关系。
1、在command_runner/lib/src/目录下创建arguments.dart,这个文件将会包括Argument class、Option class、Command class、ArgResults class
2、先定义一个enum,命名OptionType
3、定义一个叫Argument的abstract class
4、定义一个叫Option的class,且extends Argument
5、定义一个Command 类同样extends Argument
该运行器属性的类型为 CommandRunner,你后续将在 command_runner_base.dart 文件中对其进行定义。
关于late 关键字,允许声明非空的变量且不需要立即设置值,对于那些初始化依赖其他对象的变量很有用。
另外还需要在当前文件中引入import '../command_runner.dart';,这样才不会报错
6、Command类中添加私有变量_options及访问该变量的方法
7、再添加addFlag和addOption两个方法,来往_options中添加option
8、添加run方法
FutureOr<Object?> run(ArgResults args);
添加该方法需要引入import '../command_runner.dart';
9、定义ArgResults 类
步骤二 更新 CommandRunner class
1、打开command_runner/lib/src/command_runner_base.dart文件
2、按照下图代码修改CommandRunner class
3、打开
command_runner/lib/command_runner.dart文件,添加如下代码:
export 'src/arguments.dart';
export 'src/command_runner_base.dart';
export 'src/help_command.dart';
步骤三 创建helpCommand指令
1、创建文件 command_runner/lib/src/help_command.dart
2、添加如下图代码
HelpCommand 类展示了继承的优势。该类借助父类的方法完成选项配置,重写了抽象的 run 方法,并调用运行器状态来生成使用说明信息。
步骤四 更新cli.dart使之可以使用new CommandRunner
1、打开 cli/bin/cli.dart 文件
2、替换成如下图代码:
步骤五 运行应用
执行dart run bin/cli.dart help 终端打印如下图:
总结
- 定义和理解abstract class
- extend父类并且override 方法
- 使用enum