学习Flutter从Dart开始系列(三)之面向对象上

2 类与对象的声明

和绝大多数面向对象的语言相同,Dart也使用class来声明一个类,类中成员如果不可变,需要用final声明。

class Point {
  num x;
  num y;
  num z;
  final num k = 1;
}

java中如果需要访问对象的属性则需要getter和setter方法,语法很死板,虽然IDE基本上可以自动生成,但还是不够优雅。Dart对象的属性默认生成getter和setter方法,final属性则只有getter方法。对象的属性可以通过 . 来访问。Dart声明对象是new关键字可以省略。

main() {
var point = Point();
point.x = 3;
point.y = 3;
point.z = 3;
print(point.k);
}

class Point {
  num x;
  num y;
  num z;
  final num k = 1;
}

Dart中面向对象中比较有特色的东西叫做计算属性,通过其他属性来计算属性的值。通过get和set实现。

main() {
var rectangle = Rectangle();
rectangle.height = 10;
rectangle.width = 20;
print(rectangle.area);   \\200
}

class Rectangle {
  num height, width;
  num get area => width * height;
}
main() {
var rectangle = Rectangle();
rectangle.area = 100;
print(rectangle.height);
}

class Rectangle {
  num height;
   set area(value) {
    height = value/20;    \\5.0
  }
}

类成员及其私有性

  • Dart中可见性是以library
  • 一个Dart文件可以视为一个library
  • Dart中私有成员用 _ 标识

在同一个Dart文件中,用_标识的私有属性可以访问。

main() {
var student = Student();
student.name = "Joe";
student._sex = "female";
}

class Student {
  String name;
  String _sex;
}

不在同一个Dart文件中,访问私有属性会报错。

import 'Student.dart';

main() {
var student = Student();
student.name = "Joe";
student._sex = "female";  \\ error  The setter '_sex' isn't defined for the type 'Student'.
}

构造方法

Dart 不支持方法的重载

构造函数

Dart在构造函数上做了简化,在java中我们需要先把属性值传给构造函数,然后再将值传给属性,很啰嗦。Dart中可以直接将值传给属性。

var point = Point(0, 0);
print(point.x);  \\0
print(point.y);   \\0
}

class Point {
   num x, y;
   Point(this.x, this.y);
}

默认构造函数

和java相同,在没有提供构造函数时,Dart会提供一个默认的无参的构造函数。

main() {
var person = Person();
}

class Person {
  String name;
  num age;
}

命名构造函数

我们已经知道了Dart中不支持函数重载,所以我们没有办法通过重载构造函数来返回不同的对象。Dart中提供了命名构造函数来实现重载构造函数的功能。通过Class.functionName来实现构造函数。

main() {
var person = Person.origin();
print(person.name);     \\Joe
}

class Person {
  String name;
  num age;

  Person.origin(){
    name = "Joe";
    age = 18;
}

工厂构造函数

熟悉设计模式的人肯定知道有一个工厂设计模式,Dart提供了一个关键字factory来实现工厂模式。

main() {
var person = Person("Lily");
print(person.name);  \\ Lily
}

class Person {
  String name;

  factory Person(String name) {
    switch(name) {
      case "Joe" :
        return Person._internal("Joe");
      case "Lily" :
        return Person._internal("Lily");
    }
    return null;
  }

  //内置私有构造函数
  Person._internal(this.name);
}

常量构造函数

如果该类生成的对象是固定不变的, 那么就可以把这些对象定义为编译时常量。 为此,需要定义一个 const 构造函数,并且声明所有实例变量为 final。

main() {
var point = Point.point;
print(point.x);   
print(point.y);
}

class Point {
  final num x, y;
  static final Point point = Point(0, 0);

  const Point(this.x, this.y) ;
}

重定向构造函数

有时构造函数的唯一目的是重定向到同一个类中的另一个构造函数。 重定向构造函数的函数体为空, 构造函数的调用在冒号 (😃 之后。

main() {
var point = Point.origin(0);
print(point.x);  \\0
print(point.y);   \\0
}

class Point {
   num x, y;
   Point(this.x, this.y);

   //指向主构造函数
  Point.origin(x) : this(x, 0) ;
}

初始化列表

Dart final属性需要在构造函数前初始化,初始化列表可以用来初始化final属性。

main() {
  Map map = {"x" : 0, "y" : 0, "z" : 0};
  var point = Point.origin(map);
  print(point.z);
}

class Point {
   num x, y;
   final num z;

   //指向主构造函数
  Point.origin(Map map) : this.z = map["z"] {
    this.x = map["x"];
    this.y = map["y"];
  }
}

最后

点赞就时最大的支持,更多资料和文章可以关注微信公众号QStack,追寻最纯粹的技术,享受编程的快乐。
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值