Dart4Flutter – 03 – 類和泛型

黃馬發表於2018-06-22

Dart4Flutter -01 – 變數, 型別和 函式

Dart4Flutter – 02 –控制流 和異常

Dart4Flutter – 03 – 類和泛型

Dart4Flutter – 04 – 非同步和庫

Dart4Flutter-拾遺01-flutter-dart環境搭建

Dart4Flutter – 03 – 類和泛型

下面是建立一個類和建立類的例項。

main(List<String> args) {
  Dog d = new Dog();
}
 
class Dog {
 
}
複製程式碼

現在我們給類新增例項變數和建構函式,新增age和name屬性給Dog類。

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;
  }
}
複製程式碼

如上所示,給建構函式提供了名稱,這樣做使得不同的建構函式變的更加清晰。

Inheritance 繼承

你可以使用extends關鍵字繼承其他的類。

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類,通過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);
}
複製程式碼

如上所示,我們定義了兩個命名建構函式,他們只需要dog的名字,然後呼叫Pug的預設建構函式。

方法

在類中定義方法和獨立定義方法是一樣的。

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 and Setters

預設,獲取類中的任何變數都可以直接引用變數的名字。例如,dog.name,可以直接獲取或者賦值name的值。但是有時候我們希望自定義屬性的getter和setter方法,可以使用get和set關鍵字自定義getter和setter方法。

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屬性是可以訪問而且可以被隨意修改。來讓我處理一下,使name屬性私有化。

訪問控制

預設類中的所有屬性和方法是public的。在dart中,可以在屬性和方法名前新增“_”使私有化。現在讓我們使name屬性私有化。

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');
  }
}
複製程式碼

列舉

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;
  }
}
複製程式碼

結束

Dart4Flutter - 01 – 變數, 型別和 函式

Dart4Flutter – 02 –控制流 和異常

Dart4Flutter – 03 – 類和泛型

Dart4Flutter – 04 – 非同步和庫

參考

thetechnocafe.com/just-enough…

相關文章