dart的构造函数

2021-07-16  本文已影响0人  凯司机
main(List<String> args) {
  var p = Person('ksj', 29);
  var p1 = Person.withNameAgeAndHeight('ksj', 22, 178);
  print(p1.toString());
  
  // 父类应用指向子类对象
  // Object obj = 'ksj';
  // 会报错的写法
  // print(obj.substring(1));

  /* dynamic 和 Object 的区别:
    Object编译时报错、dynamic编译时不报错,但是运行时存在潜在风险
    需要增加类型判断
  */

  dynamic obj = 'ksj';
  print(obj.substring(1));
  var p2 = Person.form({
    "name1" : "1",
    "name2" : "2",
    "name3" : "3",
  });
}


class Person {
  String name;
  int age;
  double height;
  // Dart提供给我们的语法糖
  Person(this.name, this.age);
  // Dart里面没有重载
  // 命名构造函数

  Person.withNameAgeAndHeight(this.name, this.age, this.height);
  Person.form(Map<String, dynamic> mapst);

  // 重写类的方法进行覆盖
  @override
  String toString() {
    // TODO: implement toString
    return "$name $age $height";
  }
}

class Person {
  final String name;
  final int age;
  // 如果初始化不赋值,以后再也不能赋值了
  // C++里面就有这样的语法
  // 默认值的传入
  // 源码中特别喜欢用这种方法——初始化列表
  // 作用,如果创建对象时,有传入一个age,那么就使用传入的阿哥,如果没有传入age,那么使用一个默认值

  Person(this.name, {int age}): this.age = age ?? 10 {
    // 大括号里面的代码执行的时候,代码就被初始化了
    // this.age = age;
  }

  const temp = 20;
  Person(this.name, {int age}): this.age = temp > 20 ? 30 : 50  {
    // 大括号里面的代码执行的时候,代码就被初始化了
    // this.age = age;
  }

  
  // 上面是官方推荐,
  Person(this.name, {this.age = 10});
  Person(this.name, {this.age = temp  ?? 30 });
  
  // 局限性:下面局限性只能做确定的值赋值操作,不能做三目运算等不确定的操作

  // 保留着

  // 默认值里面只能给具体值,不能给函数调用

  // 解除疑惑:

}
上一篇 下一篇

猜你喜欢

热点阅读