美文网首页
Flutter/Dart - 对象/类

Flutter/Dart - 对象/类

作者: 沫之 | 来源:发表于2020-07-14 09:23 被阅读0次

前言

面向对象编程(OOP)的三个基本特征是:封装、继承、多态

dart中所有的东西都是对象,所有的对象都继承自object类

dart是一门使用类和单向继承的面向对象语言,所有对象都是类的实例。并且所有的类都是object的子类

一个类通常由属性和方法组成

创建类使用类

class Person {
  String name = "zhangsan";
  int age = 23;
  void getInfo() {
    print('${this.name}-----${this.age}');
  }

  void setInfo(int age) {
    this.age = age;
  }
}

main() {
  var p1 = new Person();
  print(p1.name);
  p1.setInfo(28);
  p1.getInfo();
}

构造函数

自定义类的默认构造函数

class Person {
  String name;
  int age;
  // 默认构造函数
  Person(String name, int age) {
    print('这是构造函数里面的内容 这个方法在实例化的时候触发');
    this.name = name;
    this.age = age;
  }

  void getInfo() {
    print('${this.name}-----${this.age}');
  }
}

main() {
  var p1 = new Person('hhh', 23);
}

默认构造函数的简写

class Person {
  String name;
  int age;
  // 默认构造函数的简写 //此处又修改
  Person(this.name, this.age);

  void getInfo() {
    print('${this.name}-----${this.age}');
  }
}

main() {
  var p1 = new Person('hhh', 23);
}

命名构造函数

实例化DateTime调用它的命名构造函数

main(List<String> args) {
  var d = new DateTime.now();
}

定义命名函数

class Person {
  String name;
  int age;
  // 默认构造函数的简写
  Person(this.name, this.age);
  Person.now() {
    print('我是命名构造函数');
  }
  // 可以定义多个命名函数
  Person.setInfo(String name, int age) {
    print('我是命名构造函数');
    this.name = name;
    this.age = age;
  }
}

main() {
  // var p1 = new Person('hhh', 23);// 默认实例化类是调用的是默认构造函数

  // var p1 = new Person.now();

  var p1 = new Person.setInfo('hhh', 23);
  
}

私有方法 和私有属性

dart 和其他面向对象语言不一样,data中没有public,private,protected这些访问修饰符,但我们可以使用_把一个属性或者方法定义为私有。

抽离出来成为一个模块时,_name,_run直接访问不到

class Person {
  String _name;
  int age;
  // 默认构造函数的简写
  Person(this._name, this.age);
  void printInfo() {
    print("${this._name}----${this.age}");
  }

  // 访问私有属性的方法
  String getName() {
    return this._name;
  }

  // 私有方法
  void _run() {
    print("${this._name}----${this.age}");
  }

  // 调用私有方法
  execRun() {
    this._run();
  }
}

可以通过 getName 、execRun方法访问。

main() {
  var p1 = new Person('hhh', 23);
  print(p1._name); //报错 没办法直接访问
  print(p1.getName());
  p1.execRun();
}

类中的getter和setter修饰符

class Rect {
  num height;
  num width;
  Rect(this.height, this.width);
  area() {
    return this.height * this.width;
  }

  get area1 {
    return this.height * this.width;
  }

  set areaHeight(v) {
    return this.height = v;
  }
}
main() {
  Rect r = new Rect(10, 4);
  print('面积:${r.area()}');

  // 访问set的方法
  r.areaHeight = 6;
  // 访问get的方法
  print('面积:${r.area1}'); //注意调用直接通过访问的属性方式访问area1
}

类中的初始化列表

dart中我们也可以在构造函数体运行之前初始化实例变量

class Rect {
  num height;
  num width;
  Rect()
      : height = 2,
        width = 10 {
    print("${this.height}---${this.width}");
  }
  area() {
    return this.height * this.width;
  }
}

类中的静态成员 静态方法

  • 使用static关键字来实现类级别的变量和函数
class Person {
  static String name = '张三';
  static void show() {
    print(name);
  }
}

main() {
  print(Person.name);
  Person.show();
}
  • 静态方法不能访问非静态成员。非静态方法可以访问静态成员。
class Person {
  static String name = '张三';
  int age = 29;

  static void show() {
    print(name);
  }

  void printInfo() {
    //非静态方法可以访问静态成员
    print(name); //访问静态属性
    print(this.age); //访问非静态属性
    show(); //调用静态方法
  }

  static void printInfo2() {
    //静态方法不能访问非静态成员
    print(name); //访问静态属性
    show(); //调用静态方法
    // print(this.age); //报错 不能访问非静态属性
  }
}

main() {
  // Person p = new Person();
  // p.printInfo();

  Person.printInfo2();
}

对象操作符

class Person {
  String name;
  int age;
  Person(this.name, this.age);
  void printInfo() {
    print(name);
  }
}
  • ? 条件运算符
Person p;
p?.printInfo();

Person p1 = new Person('hhh', 20);
p1?.printInfo();
  • is 类型判断
Person p2 = new Person('hhh', 20);
if (p2 is Person) {
  print('p2 是Person类');
}
  • as 类型转换
var p3;
p3 = '';
p3 = new Person('hhh', 20);
(p3 as Person).printInfo();
  • .. 级联操作

可以将以下代码简化

  Person p4 = new Person('hhh', 23);
  p4.printInfo();
  p4.name = 'hhh2';
  p4.age = 22;
  p4.printInfo();

简化为:

  p1..name = 'hhh3'
    ..age = 30
    ..printInfo();

类的继承

详见 Dart(06) -- 类的继承

相关文章

网友评论

      本文标题:Flutter/Dart - 对象/类

      本文链接:https://www.haomeiwen.com/subject/goqxhktx.html