[flutter]2、class

2021-10-17  本文已影响0人  史记_d5da

1、属性、方法

/*
* Dart中默认会生成getter和sett方法
* 属性和方法都是通过.访问
* final修饰的属性必须定义初始值
* dart不支持重载
* 变量或者方法前面添加下划线,为私有属性,同一个文件可以访问,外部文件不可以访问
* */
class Person {
  final String name = 'sj';
  int ?age;
  int ?_height;
  void rum() {
    print('name:$name age:$age');
  }
}

2、构造方法

构造函数可以不写函数体
1、传入this属性的构造函数
Person(this.age, this._height);
2、命名构造函数
Person.whitName(this.age, this._height);
3、当一个对象的所有成员属性都是final的时候,那么这个对象可以被创建为常量对象
(如:final int age, final int _height)
const Person(this.age, this._height);

class Person {
  final String name = 'sj';
  int ?age;
  int ?_height;
  // 1、构造函数
  Person(this.age, this._height);
  Person({this.age, this._height});
  // 2、命名构造函数
  Person.whitName(this.age, this._height);
}

4、初始化列表
校验传递的值

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');
  }
}

3、单例

class FactoryClass {
  static FactoryClass? _instance;
  // factory 构造函数可以有返回值
  factory FactoryClass() {
    // if(_instance == null) {
    //   _instance = FactoryClass._init();
    // }
    // return _instance!;
    return _instance ??= FactoryClass._init();
  }
  // 可以使用箭头函数
  // factory FactoryClass() => _instance ??= FactoryClass._init();

  // 私有的命名构造函数
  FactoryClass._init();
}

4、static属性和方法

1、..操作符,返回对象(例如 对象..方法 -> 返回当前对象)

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

void staticDemo() {
  // s1为Object
  var s1 = Object();
  s1 = StaticClass();
  // 将s1转换为StaticClass
  if (s1 is StaticClass) {
    print(s1.sum1(10));
    // ..操作符,返回对象
    s1..currentCount = 15..sum1(10);
  } else {
    print((s1 as StaticClass).sum1(10));
  }
}

5、继承

// person.dart
class Person {
  String? name;
  int? age;
  int? _heihgt;
  bool get isFree => _heihgt! < 10;
  run() {
    print("Person run");
  }

  Person(this.age);
  Person.init();
  Person.withName(this.name);
}
// student.dart
class Student extends Person {
  // 如果父类有构造函数,子类要显示的调用
  final String subName;
  // 构造方法需要给subName赋上初始值
  Student():subName = 'sj', super.init();
  Student.withName(String? name): subName= name!, super.withName(name);
  study() {
    print('认真学习');
  }
  @override
  run() {
    print("Student run...");
  }
  @override
  bool get isFree => age! < 18;
  @override
  String toString() {
    // TODO: implement toString
    return "Student extends Person";
  }
}

6、abstruct

abstructDemo() {
  AbstructClass as = SubClass();
  as.sum(10, 20);
}

abstract class AbstructClass {
  // 抽象方法
  int sum(int a, int b);
}

abstract class AbsctructClass1 {
  int sub(int a, int b);
}

class SubClass implements AbstructClass, AbsctructClass1 {
  @override
  int sum(int a, int b) {
    // TODO: implement sum
    print('a + b = ${a + b}');
    return a + b;
  }

  @override
  int sub(int a, int b) {
    // TODO: implement sub
    print('a - b = ${a - b}');
    return a - b;
  }
}

7、Minxin(混入)

/*
* 混入
* 说白了就是多继承
* 作为混入类,是不能实现构造方法的。
* */
mixinDemo() {
  D d = D();
  d.a();
}

class A {
  a() => print("a.....");
}

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

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

class D extends A with B, C {}
class E = A with B,C;

8、操作符重载

operatoDemo() {
  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;
}

上一篇下一篇

猜你喜欢

热点阅读