跳转至

类、对象、抽象类

使用class关键字声明一个类

可以使用new更上构造函数

所有的对象都继承Object

//测试
void staticDemo() {
  var s1 = Object();
  s1 = StaticClass();
  //判断类型
  if (s1 is StaticClass) {
    print(s1.sum2(10));
    //链式编程,返回对象本身
    print(s1
      ..currentCount = 15
      ..sum2(20));
  }
}

///类方法
class StaticClass {
  //静态属性,通过类访问
  static int count = 1;
  //实例属性
  int currentCount = 0;

  //常量成员
  static const String str = 'hank';

  //静态方法 通过类访问
  static int sum(int a) {
    return a + count;
  }

  //实例方法
  int sum2(int a) {
    return currentCount + a + count;
  }
}

Dart中默认会生成getter和setter方法,属性和方法都通过.访问。

final、const

final:不会变化的,最终变量。被定义出来之后,只能赋值一次

?:表示可选参数,可以为空,使用参数的时候需要用到!强制解包。

required:必传参数

class DiscoverCell extends StatelessWidget {
  final String title;
  final String imageName;
  final String? subTitle;
  final String? subImageName;

  DiscoverCell({//大括号表示可选参数
    required this.title, //title必须有
    this.subTitle,
    required this.imageName, //imageName必须有
    this.subImageName,
  })  : assert(title != null, 'title不能为空!'),
        assert(imageName != null, 'imageName不能为空!');

  //后面在使用subTitle和subImageName的时候需要!强制解包
}

使用final声明的一个只能赋值一次的变量!在使用之前必须被赋值

  final c;
  c = 999;
  // c = 222;

当一个对象所有的成员属性都是final的时候,那么这个对象可以被创建为常量对象,用const修饰构造函数。常量对象的创建效率更高。

void test() {
  LGPerson p = const LGPerson(1, 222, 'ddd');
  // p._name = 'hank';//The setter '_name' isn't defined for the class 'LGPerson'.
  // p._age = 18; //The setter '_age' isn't defined for the class 'LGPerson'.
  // p.height = 180; //The setter 'height' isn't defined for the class 'LGPerson'.
  p._run(); //name:ddd age:1 height:222
  p.printP(); //name:ddd age:1 height:222

  LGPerson p1 = LGPerson.withName('ddd', 222, 17);
  p1._run();//name:ddd age:17 height:222
}

class LGPerson {
  final String _name;
  final int age;
  final int height;

  //const修饰构造函数 创建常量对象。
  const LGPerson(this.age, this.height, this._name);
  //命名构造函数。
  LGPerson.withName(this._name, this.height, this.age);

  // {
  //   _name = name;
  //   age = age1;
  // }
  //
  // void changeAge(int age) {
  //   this.age = age;//this表示谁调用,LGPerson。final修饰的不能改变了。
  // }

  void _run() {
    print('name:$_name age:$age height:$height');
  }

  void printP() {
    _run();
  }
}

继承和初始化列表

使用extends继承一个类,子类会继承除了构造方法以外的属性和方法。

Dart是单继承的

void extendsDemo() {
  Person p = Person('cooci', 18, 180);
  p.run();
  //多态
  Person st = Student('hh', 18, 180);
  if (st is Student) {
    st.study();
  }
}

///初始化列表。
///目的:
///1、给final变量赋值
///2、校验传递的值
class Person {
  String name;
  int age;
  final int _height;
  //计算属性
  bool get isFree => _height < 110;

  //初始化列表 冒号:后面
  Person(this.name, this.age, int h)
      : _height = h,
        assert(h >= 0),
        assert(age >= 0) {
    print('name:$name age:$age height:$_height');
  }

  run() {
    print('Im:$this\nname:$name age:$age height:$_height');
  }
}

class Student extends Person {
  final String subName;

  Student(String name, int age, int h)
      : subName = name, //初始化列表必须放在super前面
        super(name, age, h);

  study() {
    print('认真学习');
  }

  @override
  // TODO: implement isFree
  bool get isFree => age < 18;
}

abstract抽象类

抽象类(协议,接口) 抽象类:不能被实例化的类,使用abstract修饰

//测试
abstractDemo() {
  AbstractClass as = SubClass();
  as.sum(10, 20);

  SubClass1 sC = SubClass1();
  sC.sum(10, 20);
  sC.sum1(20, 20);
  sC.sum2(30, 20);
}

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 extends AbstractClass {
  @override
  int sum(int a, int b) {
    // TODO: implement sum
    print('a+b=${a + b}');
    return a + b;
  }
}

class a {
  var name;
  run() {}
}

///多继承implements,所有的方法和属性必须都重写
class SubClass1 implements AbstractClass, AbstractClass1, AbstractClass2, a {
  @override
  var name;

  @override
  run() {
    // TODO: implement run
    throw UnimplementedError();
  }

  @override
  int sum(int a, int b) {
    print('subClass1..sum');
    return a + b;
  }

  @override
  int sum1(int a, int b) {
    print('subClass1..sum1');
    return a + b;
  }

  @override
  int sum2(int a, int b) {
    print('subClass1..su2m');
    return a + b;
  }
}