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,追寻最纯粹的技术,享受编程的快乐。