重学Flutter之----Dart基础知识总汇(二)

259 阅读3分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第十八天,点击查看活动详情

重学Flutter之----Dart基础知识总汇(二)

对象

dart是所有类都是对象,都是继承与Object,所以也符合面向对象的基本特征:继承、封装、多态。

类的定义

在dart中使用class关键字,默认情况下是继承的Object:

class 类名 {
}

构造函数

在dart中构造函数有以下几点需要注意的:

  • 在dart中,没有明确指定构造函数时,会有一个默认的无参构造函数
  • 当我们创建了一个构造函数的时候,默认的无参构造函数就会失效
  • 在dart中dart是不支持重载的,所以我们在声明多个构造函数是不允许的,会报错

我们了解了这些知识,来看看如何声明一个class:

class User {
  User(String name,int age,{String other,String other2}) {
      ...
  }
}

私有方法和私有方法

在dart中没有public、private、protected这些修饰符,但是可以通过在属性和方法前加上_来把这个属性和方法定义为私有:

class User {
  String _name;
  int _age;
  User(String name,int age,{String other,String other2}) {
       this._name = name;
       this._age = age
  }
  
  void _doSome(){
     ...
  }
}

getter和setter修饰符

在dart中我们使用set关键字来定义setter,使用get关键字来定义getter

class User {
  String _name;
  int _age;
  
  User(this._name, this._age, {String other = "", String other2 = ""}) {}

  info() {
    return "name:$_name age:$_age";
  }

  get info2 {
    return "name:$_name age:$_age";
  }

  set name(n) => _name = n;
}

调用:

void main() {
  var user = User("lisi", 18);
  user.info();
  user.info2();
  user.name = "zhangsan";
}

初始化列表

在dart中初始化有以下四种:

  • 在声明的时候就初始化
class Point {
    var x = 0, y = 0;
}
  • 在构造函数
class Point {
    var x, y;
    Point(this.x, this.y);
}
  • 通过初试化列表
class Point {
    var x, y;
    Point(a, b) : x = a, y = b;
}
  • 构造函数中进行初始化
class Point {
    var x, y;
    Point(a, b) {
        x = a;
        y = b;
    }
}

我们主要讲一下初试化列表,在final的属性的时候,我需要对他初始化,有需要外界的数据,我们就可以使用初始化列表

class Point {
    final sum, factor;
    Point(x, y) : sum = x + y, factor = x / y;
}

我们就可以通过初始化列表解决如何在代码运行前给实例变量进行初始化的问题。

静态属性和静态方法

在dart也是用static关键字来修饰静态

class Point {
    static num x = 1;
    static num y = 1;
    
    static void show() {
       print(name);
    }
}

对象操作符

  • .? null判断
Point p;
p?.show();
  • is类型判断
Point p = Point();
if(p is Point){
  print('p 是Point类');
}
  • as 类型转换
```
var p;
p = new Point();
(p as Point).show();
```
  • ..级联操作
//使用前
Point p = new Point();
p.show();
p.x = 11;
p.y = 22;

//使用后
Point p = new Point();
p..x = 11
 ..y= 22
 ..show();

继承

在Dart中使用extends来继承父类

class People {
  String name;

  People(this.name);

  void eat() {
    print('people -- eat');
  }
}

class Person extends People {
  int age;

  Person(String name, int age): this.age = age, super(name);

  @override
  void eat() {
    // 这里的super, 看个人需求是否调用
    super.eat();
    print('Person -- eat');
  }
}

main() {
  var people = People('name');
  people.eat();

  var person = Person("top", 10);
  person.eat();
}

在Dart抽象类使用absract来修饰,抽象类是不能被初始化的。

abstract class Size {
  int width;
  int height;

  Size(this.width, this.height);

  void getSize();

  int getArea() {
    return this.width * this.height;
  }
}

class Area extends Size {
  @override
  void getSize() {
    print('width = $width, height = $height');
  }

  Area(int width, int height): super(width, height);
}

main(List<String> args) {
  // 实例化Size会报错: Abstract classes can't be instantiated
  // var size = Size(20, 2);
  var area = Area(10, 2);
  area.getArea();
  print(area.getArea());
}

mixin

在Dart不是没有interface的,但是可以用mixin实现这个效果。

```
class Person {
  say() {
    print('say');
  }
}

mixin Eat {
  eat() {
    print('eat');
  }
}

mixin Walk {
  walk() {
    print('walk');
  }
}

mixin Code {
  code() {
    print('key');
  }
}

class Dog with Eat, Walk{}
class Man extends Person with Eat, Walk, Code{}
```