Dart学习笔记06-类和对象

2020-08-17  本文已影响0人  zombie

1.类的定义

class 类名 {
  类型 成员名;
  返回值类型 方法名(参数列表) {
    方法体
  }
}

// 在方法中使用属性(成员/实例变量)时,并没有加this 
// Dart在方法中通常使用属性时,会省略this,但是有命名冲突时,this不能省略
class Person {
  String name;
  eat() {
    print('$name在吃晚饭');
  }
}

main(List<String> args) {
  // 创建类的对象 从Dart2开始,new关键字可以省略
  var p1 = new Person();
  // 给对象的属性赋值
  p1.name = 'wang';
  // 使用 ?. 来代替 . , 可以避免因为左边对象可能为 null,导致的异常
  p1?.name = 'wang';
  // 调用对象的方法
  p1.eat(); // wang在吃晚饭
}

2.类的构造方法

2.1 普通构造方法

class Person1 {
  String name;
  int age;

  // Person1(String name, int age) {
  //   this.name = name;
  //   this.age = age;
  // }

  // 在实现构造方法时,通常做的事情就是通过参数给属性赋值 
  // 为了简化这一过程, Dart提供了一种更加简洁的语法糖形式.
  // 上面的构造方法等同于
  Person1(this.name, this.age);

  @override
  String toString() {
    return 'name = $name age = $age';
  }
}

var p2 = Person1('wang', 18);
print(p2); // name = wang age = 18

2.2. 命名构造方法

class Person2 {
  String name;
  int age;

  Person2() {
    name = '';
    age = 0;
  }

  // 命名构造方法
  Person2.withArgements(String name, int age) {
    this.name = name;
    this.age = age;
  }

  @override
  String toString() {
    return 'name = $name age = $age';
  }
}

var p3 = Person2();
print(p3); // name =  age = 0
var p4 = Person2.withArgements('wang', 18);
print(p4); // name = wang age = 18 

2.3. 初始化列表

代码示例:

class Point {
  final num x;
  final num y;
  final num distance;

  // 错误写法
  //   distance = sqrt(x * x + y * y);
  // }

  // 正确的写法 
  Point(this.x, this.y) : distance = sqrt(x * x + y * y);

  @override
  String toString() {
    return 'x = $x y = $y distance = $distance';
  }
}

var point = Point(10, 20);
print(point); // x = 10 y = 20 distance = 22.360679774997898

2.4. 重定向构造方法

class Person3 {
  String name;
  int age;

  Person3(this.name, this.age);
  // 在一个构造函数中,去调用另外一个构造函数注意:是在冒号后面使用this调用
  Person3.fromName(String name) : this(name, 0);
}

2.5. 常量构造方法

class Person4 {
  String name;
  Person4(this.name);
}

var p5 = Person4('wang');
var p6 = Person4('wang');
print(identical(p5, p6)); // 使用identical(对象1, 对象2)函数来判断两个对象是否是同一个对象 false
class Person5 {
  final String name;
  const Person5(this.name);
}

var p7 = const Person5('wang');
var p8 = const Person5('wang');
print(identical(p7, p8)); // true

2.6.工厂构造方法

class Person6 {
  String name;
  static final Map<String, Person6> _cache = <String, Person6>{};
  factory Person6(String name) {
    if (_cache.containsKey(name)) {
      return _cache[name];
    } else {
      final p = Person6._internal(name);
      _cache[name] = p;
      return p;
    }
  }
  Person6._internal(this.name);
}

var p9 = Person6('wang');
var p10 = Person6('wang');
print(identical(p9, p10)); // true

3.setter和getter

class Cat {
  String color;

  String get getColor {
    return color;
  }

  set setColor(String color) {
    this.color = color;
  }

  Cat(this.color);
}

final cat = Cat('yellow');
cat.setColor = 'black';
print(cat.getColor); // black

4.类的继承

class Animal {
  int age;

  Animal(this.age);
  run() => print('奔跑');
}

class Person extends Animal {
  String name;

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

  @override
  run() {
    print('$name在奔跑');
  }

  @override
  String toString() {
    return 'name = $name, age = $age';
  }
}

Person p = Person('wang', 28);
p.run(); // wang在奔跑
print(p); // name = wang, age = 28

5.抽象类

abstract class Shape {
  getArea();
}

class Circle extends Shape {
  double r;
  Circle(this.r);
  @override
  getArea() {
    return r * r * pi;
  }
}

class Reactangle extends Shape {
  double w;
  double h;

  Reactangle(this.w, this.h);

  @override
  getArea() {
    return w * h;
  }
}

6.隐式接口

abstract class Runner {
  run();
}

abstract class Flyer {
  fly();
}

// implements的方式要求必须对其中的方法进行重新实现
class SuperMan implements Runner, Flyer {
  @override
  run() {
    print('超人在奔跑');
  }

  @override
  fly() {
    print('超人在飞');
  }
}

var superMan = SuperMan();
superMan.run(); // 超人在奔跑
superMan.fly(); // 超人在飞

7.Mixin混入

mixin Runner {
  run() {
    print('在奔跑');
  }
}

mixin Flyer {
  fly() {
    print('在飞翔');
  }
}

class SuperMan with Runner, Flyer {
  @override
  run() {
    print('superMan在奔跑');
  }
}

var superMan = SuperMan();
superMan.run(); // superMan在奔跑
superMan.fly(); // 在飞翔

8.类成员和方法

class Student {
  String name;
  int grade;

  static String time;

  study() {
    print('$name在学习');
  }

  static gotoClass() {
    print('去上课');
  }
}

var student = Student();
student.name = 'wang';
student.grade = 4;
student.study(); // wang在学习

Student.time = '10点';
Student.gotoClass(); // 去上课

9.枚举类型

enum Colors {red, green, blue}

print(Colors.red); // Colors.red
print(Colors.red.index);  // 0
print(Colors.green.index); // 1
print(Colors.blue.index); // 2
print(Colors.values); // [Colors.red, Colors.green, Colors.blue]
上一篇 下一篇

猜你喜欢

热点阅读