热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

学习flutter必会的dart知识(三)

大伙都知道写flutter的语言是dart,所以深入flutter前还是有一些dart的基础知识需要了解。本文翻译自如果不喜欢看中文请自行查看英文版​thetechnocafe.c

大伙都知道写flutter的语言是dart,所以深入flutter前还是有一些dart的基础知识需要了解。 本文翻译自

如果不喜欢看中文请自行查看英文版thetechnocafe.com

今天学习现代编程语言最重要的一个部分,没有这个特性的现代语言甚至是不完整的。他就是类。dart里的类非常直观简单。

下面的代码声明了一个类,并创建了一个类的实例

main(List args) {
Dog d = new Dog();
}
class Dog {
}

通过类的构造函数给实例添加变量,下面给Dog类增加了name字段和age字段

main(List 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 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 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 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 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 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 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 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 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 args) {
Dog.bark();
}
class Dog {
String name;
int age;
Dog(this.name, this.age);
static bark() {
print('Bow Wow');
}
}

枚举Enum

dart 支持枚举类型 如果你熟悉其他的编程语言如Java那么,对枚举就非常了解了

main(List 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 args) {
DataHolder dataHolder = new DataHolder('Some data');
print(dataHolder.getData());
dataHolder.setData('New Data');
print(dataHolder.getData());
}
class DataHolder {
T data;
DataHolder(this.data);
getData() {
return data;
}
setData(data) {
this.data = data;
}
}


推荐阅读
author-avatar
亘古轻柔
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有