大伙都知道写flutter的语言是dart,所以深入flutter前还是有一些dart的基础知识需要了解。 本文翻译自
如果不喜欢看中文请自行查看英文版 thetechnocafe.com
今天学习现代编程语言最重要的一个部分,没有这个特性的现代语言甚至是不完整的。他就是类。dart里的类非常直观简单。
下面的代码声明了一个类,并创建了一个类的实例
main(List<String> args) {
Dog d = new Dog();
}
class Dog {
}
通过类的构造函数给实例添加变量,下面给Dog类增加了name字段和age字段
main(List<String> args) {
Dog d = new Dog('Duffy', 2);
print(d.name);
}
class Dog {
String name;
int age;
Dog(String name, Stirng age) {
this.name = name;
this.age = age;
}
}
dart 提供了语法糖,用来生成构造函数,如:
main(List<String> args) {
Dog d = new Dog('Duffy', 2);
print(d.name);
}
class Dog {
String name;
int age;
Dog(this.name, this.age);
}
上面的代码只用一行代码就完成了构造函数,第一个参数,对应到name
第二个参数对应age
命名构造函数
dart提供的另一个定义构造函数的方法,叫做 命名构造函数
如:
main(List<String> args) {
Dog d = new Dog.newBorn();
print(d.name);
}
class Dog {
String name;
int age;
Dog(this.name, this.age);
Dog.newBorn() {
name = 'Doggy';
age = 0;
}
}
上面的代码,构造函数有了一个名字(newBorn), 这样在初始化时更清楚使用了哪个类
继承
dart里继承用关键字 extend
main(List<String> args) {
Pug p = new Pug('Duffy', 5);
print(p.name);
}
class Dog {
String name;
int age;
Dog(this.name, this.age);
Dog.newBorn() {
name = 'Doggy';
age = 0;
}
}
class Pug extends Dog {
Pug(String name, int age): super(name, age);
}
Pug类继承了Dog类,并且在Pug的构造函数里用SUPER关键字调用了Dog类的构造函数,
在一个类里还可以调用其他的构造函数,通过在(:)冒号后调用this关键字
如
main(List<String> args) {
Pug p = new Pug.small('Duffy');
print(p.name);
}
class Dog {
String name;
int age;
Dog(this.name, this.age);
Dog.newBorn() {
name = 'Doggy';
age = 0;
}
}
class Pug extends Dog {
Pug(String name, int age): super(name, age);
Pug.small(Stirng name): this(name, 1);
Pug.large(Stirng name): this(name, 3);
}
上面定义了两个命名构造函数, small 调用了自身的构造函数,而自身又调用了dog的构造函数。
方法
方法定义和dart里单独定义一个函数是一样的,
main(List<String> args) {
Dog d = new Dog('Duffy', 10);
d.bark();
}
class Dog {
String name;
int age;
Dog(this.name, this.age);
Dog.newBorn() {
name = 'Doggy';
age = 0;
}
bark() {
print('Bow Wow');
}
}
函数重写
main(List<String> args) {
Pug p = new Pug.small('Duffy');
p.bark();
}
class Dog {
String name;
int age;
Dog(this.name, this.age);
Dog.newBorn() {
name = 'Doggy';
age = 0;
}
bark() {
print('Bow Wow');
}
}
class Pug extends Dog {
Pug(String name, int age): super(name, age);
Pug.small(Stirng name): this(name, 1);
Pug.large(Stirng name): this(name, 3);
@override
bark() {
print('Meow!');
}
}
getter setter
默认的情况下类里定义的任何变量都是可以访问的,如dog.name,变量的值也可以直接读写。但是有时候不希望直接读写而是通过getter setter。dart里 是通过get set 关键字实现的
如:
main(List<String> args) {
Dog d = new Dog('Duffy', 5);
d.respectedName = 'Mr.Duffy';
print(d.respectedName);
}
class Dog {
String name;
int age;
Dog(this.name, this.age);
String get respectedName {
return 'Mr.$name';
}
set respectedName(String newName) {
name = newName;
}
Dog.newBorn() {
name = 'Doggy';
age = 0;
}
bark() {
print('Bow Wow');
}
}
上面的代码 name 属性依然是可读写的
可访问性
默认类里的任何属性都是public的,也是是公开的,可以直接访问,如果想保护变量,使变量变成私有的private,只要在变量名称前加”_”即可,如:
main(List<String> args) {
Dog d = new Dog('Duffy', 5);
print(d.name); //This will throw error
}
class Dog {
String _name;
int age;
Dog(this.name, this.age);
String get respectedName {
return 'Mr.$name';
}
set respectedName(String newName) {
name = newName;
}
Dog.newBorn() {
name = 'Doggy';
age = 0;
}
bark() {
print('Bow Wow');
}
_hiddenMethod() {
print('I can only be called internally!');
}
}
抽象类和方法
抽象类用abstract关键字
abstract class AbstractDog {
void bark();
void _hiddenMethod();
}
上面只是在类前增加了 abstract 关键字,方法前不需要加。类方法也只是声明了,不需要具体实现。
静态方法
在字段或方法前增加static关键字就变成了静态,如:
main(List<String> args) {
Dog.bark();
}
class Dog {
String name;
int age;
Dog(this.name, this.age);
static bark() {
print('Bow Wow');
}
}
枚举Enum
dart 支持枚举类型 如果你熟悉其他的编程语言如Java那么,对枚举就非常了解了
main(List<String> args) {
Dog d = new Dog('Duffy', 12, CurrentState.sleeping);
print(d.state == CurrentState.sleeping); //Prints 'true'
}
enum CurrentState {
sleeping,
barking,
eating,
walking
}
class Dog {
String name;
int age;
CurrentState state;
Dog(this.name, this.age, this.state);
static bark() {
print('Bow Wow');
}
}
泛型
dart支持泛型,如有一个类,管理一个数据,希望这个数据是任何类型。
main(List<String> args) {
DataHolder<String> dataHolder = new DataHolder('Some data');
print(dataHolder.getData());
dataHolder.setData('New Data');
print(dataHolder.getData());
}
class DataHolder<T> {
T data;
DataHolder(this.data);
getData() {
return data;
}
setData(data) {
this.data = data;
}
}