likes
comments
collection
share

Flutter——dart 面向对象(一)

作者站长头像
站长
· 阅读数 2

1. 类与对象

在Flutter中,使用class 关键字声明一个,使用new加上构造函数生成一个对象,所有的对象都默认继承Object类。Dart中会默认生成getter 和 setter方法,属性和方法都通过点语法进行访问,Dart方法不支持重载。final修饰的属性必须定义初始值。

声明一个类:

class LGPerson {
  String? name;
  int? age;
  final String hobby = 'coding';
  void run() {
    print("name:$name age:$age");
 }
}

声明一个对象和方法调用:

  LGPerson p = LGPerson();
  p.name = 'LS';
  p.age = 18;
  p.run();

在Dart中,同文件是不存在私有化的,只有在不同文件中,才能有私有属性。 新建一个文件,并添加一个新的LGTeacher类,只对外暴露height属性和printTeacher方法。

class LGTeacher {
  String? _name;
  int? _age;
  int? height;

  void _run() {
    print("name:$_name age:$_age");
  }
  void printTeacher() {
   _run();
  }
}

这里可以看到,外部就无法访问私有属性和方法了,而如果是同一个文件里面的class,则依然可以访问。

Flutter——dart 面向对象(一)

2. 构造函数

定义完一个类之后,这个类默认就有构造函数。相当于:

LGperson(){}

这里可以自定义构造函数,如果自定义了构造函数,那么默认的构造函数就无效了。

 LGPerson(int age,String name){
    _name = name;
    _age = age;
  }
  
  LGPerson p = LGPerson(18,"test");

如果这里不是私有属性的话, 就会出现属性和参数名字一样的情况:

    name = name;
    age = age;

这里可以将参数改名字或者在属性前面加this.,但是推荐使用Dart语法糖来自动赋值。

  LGPerson(this.age,this.name);

用了这个语法糖之后,属性也可以不需要变成Nullability的。

class LGPerson {
  String name;
  int age;

  LGPerson(this.age,this.name);
  void run() {
    print("name:$name age:$age");
 }
}

如果属性使用final修饰的,那么这个属性之后就不能改变了。

Flutter——dart 面向对象(一)

class 里面还可以创建命名构造函数:

  LGPerson.withName(this.name,this.age);
  // 调用
  LGPerson p2 = LGPerson.withName("kk", 18);

final 有什么存在的意义呢?其实这里有个应用场景,就是常量对象。 当一个类的所有属性用final修饰,构造方法用const 修饰,那么创造出来的对象就是常量对象了。(这里需要所有属性都用final修饰,否则构造方法用const修饰就会报错)。

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

  const LGPerson(this.age,this.name,this.height);
//  LGPerson.withName(this.name,this.age);
  void run() {
    print("name:$name age:$age");
 }
}