
2.4 Dart 中的类与方法
类是面向对象编程语言中的概念,Dart 也是一门面向对象的编程语言,其中的类和对象与Java 中的类和对象非常相似,也有继承和重写的特性,每个对象都是一个类的实例,都继承自Object 对象。但Dart 中的类又有自己的特点,本节我们就来介绍Dart 中的类和方法。
2.4.1 Dart 中的类
Dart 中的类和Java 等面向对象语言中的类的用法基本一样,特点也类似。不过Dart 中的类支持多继承,并且在使用时增加了一些自己的特色,使得程序设计非常便捷。
类的创建
Dart 中使用class 关键字来表示一个类。在类中我们可以编写各种功能函数。
创建类可以使用new 关键字,也可以不使用。具体来说,对于Dart 2 及以后的版本,在创建类时可以不使用new 关键字。以下是创建类的示例。

如果我们想获取一个类实例的类型,在Dart 中可以使用Object 的runtimeType 属性来实现,示例如下。

类方法的调用和类对象的赋值
Dart 中调用方法的形式是“对象.方法”,示例如下。

Dart 中还有一个比较实用的方法,就是可以通过“对象?.方法”的形式来实现类方法的调用,这样可以避免当对象为 null 时程序出现异常,示例如下。

当然我们也可以对类对象执行赋值、取值等操作,示例如下。

类的继承与重载
Dart 支持类的继承与重载,通过extends 来继承父类,进而实现类的功能拓展和复用,子类可以重载父类方法,通过super 来引用父类方法,示例如下。

在以上代码中,我们使用@override 注解来表示重写父类方法,当然除了@override 注解,Dart 中还有其他注解,例如可以使用 @proxy 注解来避免警告信息,大家可以自行尝试。
除了支持单继承,Dart 还支持多继承,即可以让一个类对象继承多个父类的属性、方法,这也是Dart 语言的一个特色。我们可以使用with 关键字实现多继承,示例如下。


抽象类和枚举
Dart 中抽象类的作用和用法与Java 中的类似,都是通过abstract 关键字将一个类声明为抽象类,然后在里面定义抽象方法、变量等,示例如下。

Dart 也支持枚举类型的定义,使用enum 关键字可以声明枚举类型,作用和用法和其他面向对象语言中的类似,示例如下。

实现接口
Dart 支持多个接口实现,可以使用implements 关键字。实现接口便于类的扩展、复用和解耦,从而提升开发效率,示例如下。

2.4.2 Dart 中的方法
方法也就是函数,Dart 中方法的定义和作用与Java 等面向对象语言中的基本一致,大家可以对比着学习。Dart 中的方法用于实现具体逻辑和业务封装,我们可以通过传参来实现相关功能。接下来我们来看一下具体方法的实现。
构造方法
编写了类代码之后,有时需要传递一些参数来初始化这个类,这时可以定义构造方法进行传参。注意构造方法需要和类同名,示例如下。

静态方法
Dart 支持静态方法的定义和使用,使用静态方法时无须创建对象,使用时直接采用“类名.函数名”的形式进行调用即可。对于一些经常使用的方法,我们可以通过static 关键字将其定义成静态方法,示例如下。


可选参数方法
Dart 中另一个颇具特色的特性就是具有可选参数方法,我们可以不将参数全部传递到方法中,而只选择部分参数进行传递,示例如下。

getter 方法和setter 方法
getter 方法和setter 方法分别用于取值和赋值操作,Dart 中无须单独声明getter 方法和setter方法,直接调用即可,示例如下。


匿名函数
Dart 中的匿名函数和Java 中的匿名函数的作用和用法基本一致,即可以在传递的参数里直接实现方法,示例如下。

泛型类型
泛型类型一般用于进行多样化类型扩展。Java 中的泛型类型使用T 来表示,Dart 中同样可以使用T 来表示泛型类型,示例如下。

