標籤:

學習flutter必會的dart知識(三)

大夥都知道寫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;
}
}

推薦閱讀:

TAG:Dart | Flutter |