Dart是面向对象的语言,第一部分主要内容:
- 类与对象,声明、创建及基本特性
- 构造方法及初始化列表
- 静态成员及对象操作符的使用
属性和方法
- 属性默认会生成getter和setter方法
- 使用final声明的属性只有getter方法,即使用final声明的属性只可读不可写
- 属性和方法通过.访问
- 方法不能被重载
计算属性
- 顾名思义,计算属性的值是通过计算而来的,本身不储存值
- 计算属性赋值,其实是通过计算转换到其他实例变量
void test() {
var rect = Rectangle();
rect.width = 10;
rect.height = 20;
print(rect.area);
rect.area = 200;
print(rect.width);
}
class Rectangle {
num width, height;
num get area => width * height; // 计算属性,得到值
set area(value) { // 计算属性 ,设置值
width = value / (height ?? 1);
}
}
构造方法
- 如果没有自定义构造方法,则会有一个默认的构造方法
- 如果存在自定义构造方法,则默认的构造方法无效
- 构造方法不能重载
命名构造方法
- 使用命名构造方法,可以实现多个构造方法
- 使用类名.方法的形式实现
void test() {
var person = Person('Tom', 20);
var person1 = Person.withName("Robin");
Person.withAge(20);
}
// 构造方法
class Person {
String name;
int age;
final String gender = '';
// Person() {} // 默认构造方法,可以省略
// Person(String name,int age){
// this.name = name;
// this.age = age;
// }
// 上面构造方法和下面的等价,Dart的语法糖的形式 语法糖构造方法是在构造方法之前就已经给属性赋值了
Person(this.name,this.age);
Person.withName(String name) {
this.name = name;
}
// 上面构造方法也可以用语法糖
Person.withAge(this.age);
void work() {
print('work...');
}
}
常量构造方法 -在开发中更快,因为在编译的时候就已经确定了
- 如果类是不可变状态,可以把对象定义为编译时常量
- 使用const声明构造方法,并且所有的变量都为final
- 使用const声明对象,可以省略
void ptest() {
const person = Person('Robin', 18, 'Male');
/// 'age' can't be used as a setter because it is final
person.age = 10;
}
class Person {
final String name;
final int age;
final String gender;
const Person(this.name,this.age,this.gender);
void work() {
print('work...');
}
}
工厂构造方法
- 工厂构造方法类似于设计模式中的工厂模式
- 在够造方法前添加关键字factory实现一个工厂构造方法
- 和其他构造方法不同,在工厂构造方法中可以返回对象
// 官网例子
class Logger {
final String name;
static final Map<String,Logger> _cache = <String,Logger>{};
factory Logger(String name) {
if (_cache.containsKey(name)) {
return _cache[name];
} else {
final logger = Logger._internal(name);
_cache[name] = logger;
return logger;
}
}
Logger._internal(this.name);
// Logger._internal(this.name){
// return Text('data'); // 非工厂构造方法是不可以返回对象的 tips:Constructors can't return values.
// }
void log(String msg) {
print(msg);
}
}
初始化列表
- 初始化列表会在构造方法执行之前执行
- 使用逗号分隔初始化表达式
- 初始化列表常用于设置final变量的值 当然设置非final也是可以的
class Person2 {
String name;
int age;
final String gender;
Person2(this.name,this.age,this.gender);
/// 初始化列表
Person2.withMap(Map map):gender = map['gender'] {
print('$name $age $gender ...'); // null null Fmale ...
name = map['name'];
age = map['age'];
}
void work() {
print('$name $age $gender work...'); // Tom 19 Fmale work...
}
}
静态成员
- 静态成员即可是方法也可以是属性
- 使用static关键字来实现类级别的变量和函数
- 静态成员不能访问非静态成员,非静态成员可以访问静态成员
- 类中的常量需要使用static const 声明
class Page {
static int currentPage = 1;
// 下滑
static void scrollDown() {
currentPage = 1;
print('ScrollDown...');
}
void scrollUp() {
currentPage++;
print('ScrollUp...');
}
}
对象操作符
Person类:
class Person {
String name;
int age;
void work() {
print('$name $age work...');
}
}
-
条件成员的访问:?.
Person person; person?.work(); // 在执行work()时,判断person是否为空,为空就不执行work(),不为空才会执行work() person?.name;
-
类型转换:as
var person; person = 'person'; person = Person(); (person as Person).work();
-
是否是指定类型:is,is!
var person; person = 'person'; if (person is Person) { person.work(); } if (person is! Person3) { }
-
级联操作:..
var person = Person3(); person..name = 'Tom' // 给name赋值,然后返回的还是当前对象 ..age = 20 ..work(); Person3()..name = 'Robin' ..age = 20 ..work();
对象call方法
-
如果类实现了call()方法,则该类的对象可以作为方法使用
class CallMethod { String call(String name,int age) { return 'name:$name and age:$age'; } } var callMethod = CallMethod(); print(callMethod('robin',10));
网友评论