學習flutter必會的dart知識(三)
大夥都知道寫flutter的語言是dart,所以深入flutter前還是有一些dart的基礎知識需要了解。 本文翻譯自
如果不喜歡看中文請自行查看英文版
今天學習現代編程語言最重要的一個部分,沒有這個特性的現代語言甚至是不完整的。他就是類。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;
}
}
推薦閱讀: