04. Flutter基础视频--Dart面向对象

68 阅读2分钟

类与对象

/*
* 类和对象
* 使用class关键字声明一个类
* 可以使用new构造函数
* 所有的对象都继承Object类
* */
void main(List<String> arguments) {
  LGPerson p = LGPerson();
  p.name = 'shark';
  p.age = 18;
  p.run();  /// name: shark age: 18
  test(); ///name: shark age: 10  name: shark age: 10
}

    
/*Dart中默认会生成getter和setter方法
* 属性和方法都通过 .访问
* final修饰的属性必须定义初始值
* */
class LGPerson {
  String? name;
  int? age;
  int? _year; // 加上下划线,就是私有的属性, 但同一个文件内还是可以访问的
  void run() {
    print('name: $name age: $age');
  }
  void _printP() {   // 加上下划线,就是私有的方法
    print('name: $name age: $age');
  }
}

/// 但同一个文件内还是可以访问的, 而且很神奇,这个test方法是全局的
void test() {
  LGPerson p = LGPerson();
  p.name = 'shark';
  p.age = 10;
  p._year = 123;
  p.run();
  p._printP();
}

构造方法

  • Dart中默认会生成getter和setter方法
  • 属性和方法都通过 .访问
  • final修饰的属性必须定义初始值
  • 当一个对象所有的成员属性都是final的时候,那么这个对象可以被创建为常量对象
  • 使用const修饰构造函数
/*Dart中默认会生成getter和setter方法
* 属性和方法都通过 .访问
* final修饰的属性必须定义初始值
* 当一个对象所有的成员属性都是final的时候,那么这个对象可以被创建为常量对象
* 使用const修饰构造函数
* */
class LGPerson {
  String? name;
  int? age;
  int? _year; // 加上下划线,就是私有的属性, 但同一个文件内还是可以访问的
  // LGPerson(int age, String name) {
  //   this.name = name;
  //   this.age = age;
  // }
  //
  LGPerson(this.age, this.name);
  /// 命名构造函数
  LGPerson.whitName(this.name, this.age);

  void run() {
    print('name: $name age: $age');
  }
  void _printP() {   // 加上下划线,就是私有的方法
    print('name: $name age: $age');
  }
}

单利方法

class FactoryCalss {
  /// 需要一个单利对象
  static FactoryCalss? _instance;
  factory FactoryCalss() => _instance ??= FactoryCalss._init(); /// 简化版本
  // factory FactoryCalss() {
  //   if(_instance == null) {
  //     _instance = FactoryCalss._init();
  //   }
  //   return _instance ??= FactoryCalss._init();
  // }
  /// 私有的命名构造函数。这样的话外部就无法调用FactoryCalss()初始化对象了,会报错了
  FactoryCalss._init();
}

初始化列表方法-可检验参数

/// 初始化列表,目的:1 给final变量赋值
/// 校验传递的值
class Person {
  String name;
  int age;
  final height;
  Person(this.name, this.age, int h):
        height = h, assert(h >= 0) {
      print('name: $name age:$age, height:$height');
  }
}

静态方法

class StaticClass {
  //静态属性
  static int count = 1;
  int currentCount = 0;
  //静态方法
  static int sum(int a) {
    return a + count;
  }
  //实例方法
  int sum2(int a) {
    return currentCount + a + count;
  }
}

/// 静态方法使用
StaticClass.count = 10;
StaticClass.sum(9);

链式编程

..语言,链式编程

var s1 = StaticClass();
print(s1..currentCount = 15..sum2(20));  /// 链式编程,返回的是对象本身

继承

  • Dart中的继承
  • 使用extends继承一个类
  • 子类会继承除了构造方法以外的属性和方法
  • Dart是单继承的
/// 初始化列表,目的:1 给final变量赋值
/// 校验传递的值
class Person {
  String? name;
  int? age;
  int? _height;
  bool get isFree => _height! < 110;
  Person(this.name, this.age){
      print('name: $name age:$age');
  }
  void run() {
    print('run');
  }
}

class Student extends Person {
  Student(super.name, super.age);
  study() {
    print('认真学习');
  }
}

抽象类

  • 类似于协议
/* 抽象类
* 不能被实例化的类,使用abstract修饰
* */
abstractDemo() {
  SubClass as = SubClass();
  as.sum(1, 10);
  as.sum1(1, 10);
  as.sum2(1, 10);
}

abstract class AbstractClass {
  /// 这就是抽象方法
  int sum(int a, int b);
}

abstract class AbstractClass1 {
  /// 这就是抽象方法
  int sum1(int a, int b);
}

abstract class AbstractClass2 {
  /// 这就是抽象方法
  int sum2(int a, int b);
}

class SubClass implements AbstractClass,AbstractClass1,AbstractClass2 {
  @override
  int sum(int a, int b) {
    print('a + b = ${a + b}');
    return a + b;
  }

  @override
  int sum1(int a, int b) {
    print('sum1: a + b = ${a + b}');
    return a + b;
  }

  @override
  int sum2(int a, int b) {
    print('sum2: a + b = ${a + b}');
    return a + b;
  }
}

重载符>, <, =等

  • bool operator > (OperatorClass other) => this.age > other.age;
operatorDemo() {
  OperatorClass op1 = OperatorClass(10);
  OperatorClass op2 = OperatorClass(20);
  print(op1 > op2);
}

class OperatorClass {
  int age;
  OperatorClass(this.age);
  bool operator > (OperatorClass other) => this.age > other.age;
}

混入

  • 说白了就是多继承, 如果多个类有同名方法会怎样呢,如run方法, 会运行最后一个类的方法,如C的run
  • 作为混入类,是不能实现构造方法的
/* 混入
* 说白了就是多继承, 如果多个类有同名方法会怎样呢,如run方法, 会运行最后一个类的方法,如C的run
* 作为混入类,是不能实现构造方法的
* */
mixinDemo() {
  D d = D();
  d.runA();
  d.runB();
  d.runC();
  d.run();
  /*
  *
a ...
b ...
c ...
run c 
* ...*/
}
class D extends A with B, C {}
class A {
  runA() => print("a ...");
  run() => print("run a ...");
}

class B {
  runB() => print("b ...");
  run() => print("run b ...");
}

class C {
  runC() => print("c ...");
  run() => print("run c ...");
}

demo