三、类
3.1 类基础
-
创建
class Animal { var name = "gou"; var age = 12; info() { print("姓名 ${this.name} 年龄 ${this.age}"); } } -
导入
import 'class/Animal.dart'; -
构造函数
Person(String name, int age) { this.name = name; this.age = age; } -
默认构造函数
Person(this.name, this.age); -
命名构造函数
Person.setName(name) { this.name = name; } -
私有属性 (没有 public private) 加下划线也可以。 那属性就不能直接访问了, 但是如果想访问的话,可以通过公用的方法来访问。
var _sex; -
getter setter
// get 方法相当于计算属性了 get info { return "名字: wu 姓名: aaa"; } // set p.height = 22; print(p.animalHeight); set height(int height) { this.animalHeight = height; } -
实例化之前 初始化属性
Person():this.name = "shuai" { print("${this.name}"); } -
私有方法 和 私有属性是一样的。 加下划线就可以了。
3.2 类、静态成员、操作符、继承
-
静态属性 和 静态方法 通过类名访问。 用static修饰就是静态的。 static String name = "xiaowu"
-
非静态方法、 访问 静态属性。
直接使用 name访问。 不需要前缀 调用静态方法, 也是直接调用就可以。 show(); -
运算符
-
?
// 如果p为空则不会调用方法了 p?.info() -
as
// 类型转换。 var p = new Object() var p = new Person() (p as Person).name; // 不转换访问不到 name -
is
// 类型判断 if (p is Person) {} -
..
// .. 可以连续访问对象的属性 和 方法。 p1..name = "xiaowu" ..age = 14 ..show(); -
继承 extends
-
子类要实现 父类的构造方法
Animal(this.name, this.age); Dog(name, age) : super(name, age); -
子类重写父类方法
@override info() { super.info(); print("姓名 ${this.name} 年龄 ${this.age} 性别: ${this.sex}"); }
-
-
-
3.3 抽象类 、 接口、 多态
abstract class Car {
run();
info() {
print("这是汽车");
}
}
class audi extends Car {
@override
run() {
print("奥迪再跑");
}
}
class msds extends Car {
@override
run() {
print("奔驰再跑");
}
}
class bmw implements Car {
@override
info() {
print("如果是 implements 就必须要重写父类的方法. extends 继承则不需要");
}
@override
run() {
print("宝马再跑");
}
}
main(List<String> args) {
Car car1 = new audi();
Car car2 = new msds();
car1.run();
car2.run();
car2.info();
var bao = new bmw();
bao.run();
}
-
抽象类
- 抽象类的没有实现的方法,子类必须全部实现。
- 抽象类的方法,可以继承。
用户定义一套标准。 子类可以继承抽象类、也可以实现抽象类的接口。 -
多态
父类定义变量,指向子类的实例。 父类定义方法,子类实现。每个子类有不同的表现形式。 -
接口
-
什么是接口
就是协议,定义一套规范
-
抽象类和接口有什么区别
Dart 的就接口 就是通过抽象类来实现的。 子类如果 implements 就是实现了接口。 extends 和 implements 的却别 如果子类只是想使用父类的规范,不想继承他实现的方法。 就使用 implements
-
3.4 多继承、多接口。 with关键字
-
Dart 的 类 可以同时实现多个接口
class LongCity implements Car, GuoChan { @override info() { // TODO: implement info throw UnimplementedError(); } @override proInfo() { // TODO: implement proInfo throw UnimplementedError(); } @override run() { // TODO: implement run throw UnimplementedError(); } } -
Dart 可以使用with 关键字实现多继承。
注意 :
- 父类方法重复,根据继承关系,后面覆盖前面的
- with关键字的父类。称之为 mixins 类。 他不能继承别的类,只能继承 Object
- mixins 类 不能有构造函数
class Car { var name = "Car"; var num = 10000; run() { print("汽车再跑"); } } class YiQi { info() { print("一汽大众"); } productInfo() { print("中国一汽"); } } class DaZhong { run() { print("大众再跑"); } } class YiQiDaZhong extends Car with YiQi, DaZhong { }
3.5 泛型
-
泛型方法
getFormat<T>(T value) { return value; } getFormat<String>("Str"); -
泛型类
class MyList<T> { var list = []; add(T value) { this.list.add(value); } getList() { return this.list; } } var list = new MyList<String>(); list.add("只能添加String类型的value"); print(list.getList()); -
泛型接口
abstract class Cash<T> { saveObject(String key, T value); getObject(String key); } class meoryCash<T> implements Cash<T> { @override getObject(String key) { } @override saveObject(String key, T value) { } }
3.6 库
-
Dart 第三方库依赖于 pub 地址如下。
-
系统库使用
// 系统库 import 'dart:math'; main(List<String> args) { var a = min(1, 2); print(a); } -
第三方库使用
- 添加依赖。在项目根目录创建文件夹 pubsepec.yaml 文件。
- 编辑内容如下
name: startup_namer description: A new Flutter application. publish_to: 'none' # 希望项目能托管到 pub.dev 需要指定 version: 1.0.0+1 # 版本号 environment: # flutter sdk版本 sdk: ">=2.7.0 <3.0.0" dependencies: # flutter: # sdk: flutter cupertino_icons: ^0.1.3 # 一个图标库 # https://pub.flutter-io.cn/packages/cupertino_icons # https://flutter.github.io/cupertino_icons/ http: ^0.13.3 # dev_dependencies: # 开发环境下依赖的包 # flutter_test: # sdk: flutter # flutter: # uses-material-design: true # 是否使用material-design 设计风格// 依赖库 import 'package:http/http.dart' as http;-
下载依赖。 执行 pub get
-
导入使用