4. Class的使用
所有代码均在github上github地址
1. 类的构造函数定义
类的构造函数本质也是函数,因此其定义方式和函数的定义套路是一样的,有具名参数函数和位置参数函数这两种,另外还包括使用dart语法糖的形式。
如果一个函数没有构造函数会怎么样?
如果不指定构造器的话,class会调用一个不带任何参数的默认构造器
该构造器没有任何传参,并且在继承父类构造器的时候不会传参
构造器不会被继承,当没有构造器,会调用默认的而不会继承父类的。因此,如果继承了父类,父类构造函数中需要传参,而子类中没有使用构造函数,会报错!
还有一个注意点:
- 感觉: 在类中调用变量的时候按照作用域网上找,所以定义this.num 和num应该都会找到实例变量定义的num变量
上面这个感觉不一定对,但是从很多代码上来看是这样的,后面要仔细研究下
1. 基本构造函数形式
其本质位置参数函数作为构造函数
class Point {
// 定义函数内存在的变量和类型。
num x;
num y;
num z = 0;
// 函数的构造函数
// 利用构造函数,利用传入参数对类进行初始化
Point(num x, num y) {
this.x = x;
this.y = y;
}
}
void main() {
var p = Point(1, 2);
p.x = 3;
print(p.z); // 0
print(p.x); // 3
}
2. 利用具名参数函数构造函数
class Point4 {
num x, y;
Point4({num x, num y}) {
this.x = x;
this.y = y;
}
}
void main() {
var p4 = Point4(
x: 1,
y: 2
);
print('p4.x = ${p4.x}'); // 1
}
3. 利用dart自带语法糖简化位置函数构造函数的形式
class Point2 {
num x, y;
// dart提供的语法糖,将对应传入的值,赋值内内部对应的参数
Point2(this.x, this.y);
}
void main() {
var p2 = Point2(1, 2);
}
4. 使用冒号语法进行赋值
class Point3 {
num x, y;
double initDis;
// 可以直接通过冒号的方式对this.x, this.y进行赋值
Point3(x, y)
: x = x,
y = y,
initDis = sqrt(x * x + y * y);
// 其他方法定义
// ......
}
6. 使用具名构造器
上面所有的构造器都是默认构造器,创建类的时候会默认执行构造器,但可能会有这种情况,希望同样的类,但是在不同场景下具有不同的构造函数方法,这样就需要一个具名构造器,可以对不同场景进行切换,对于相同的类进行定制化
继承具名构造器
具名构造器并不会被直接继承,默认调用的是父类中的默认构造器,因此,如果想要继承具名构造器,需要在子类中进行调用才行。
// 构造器是不会被继承的,所以父类的具名构造器也是不会被子类继承的
// 如果要使用父类的具名构造器,需要在子类上进行调用
class Point3 {
num x, y;
double initDis;
// 可以直接通过冒号的方式对this.x, this.y进行赋值
Point3(x, y)
: x =