Flutter筆記之Dart類對象

Dart語言中類和Java語言中都很類似,但是也有一些區別

1.類的定義和初始化

  • 默認或生成set/get方法
  • 使用final修飾的只有get方法
  • 屬性和方法通過.來房訪問
  • 方法不能被重載
  • Dart中可見性以庫爲單位,默認情況下一個Dart文件就是一個庫
  • _用來表示私有性
class Student {
  String name;
  int age;
  final String adress;

  Student(names, age) {
    this.name = names;
    this.age = age;
  }

  void print_Info() {
    print("name=$name,age=$age");
  }
}
//初始化
  Student student = new Student("張一博", 26);
  student.name = "Tom";
  student.print_Info();

2.類計算屬性

void main() {
  //創建對象設置屬性
  Yuan yuan = new Yuan();
  yuan.height = 100;
  yuan.width = 20;
// 設置圓面積屬性
  print(yuan.area);
  //設置圓width屬性
  yuan.area = 100;
  print(yuan.width);
// 獲取圓周長屬性
  print(yuan.zhouchang)
  yuan.zhouchang = 100;

  print(yuan.width);
}

class Yuan {
  num width;
  num height;

  //計算屬性 area 面積 屬性
  num get area {
    return width * height;
  }

  //設置屬性
  set area(value) {
    width = value / 5;
  }
  //計算屬性 area 周長 屬性
  num get zhouchang => (width + height) * 2;
  //計算屬性 width 屬性
  set zhouchang(value) => width = value / 2 - 20;

  int getAre() {
    return width * height;
  }
}

3.類的構造方法

Dart中類的構造和Java中構造不太一樣,Dart中類的構造不能重載,必須通過特定方式來創建不同的構造方法。

/**
 * 構造方法創建注意
 *
 * 構造方法不能重載
 *
 */
class Person {
  String name;
  int age;
  final String adress;

  Person(String name, int age) {
    this.name = name;
    this.age = age;
  }

  /**
   * 多個構造方法通過以下方式
   */
  Person.withName(String name) {
    this.name = name;
  }

  Person.withAge(int age) {
    this.age = age;
  }

  Person.withInfo(String name, int age) {
    this.name = name;
    this.age = age;
  }

  /**
   * final 屬相通過可以通過以下構造方法賦值
   */
  Person.withAllInfo(this.name, this.age, this.adress);

  void printPersonInfo() {
    print("name=$name,age=$age");
  }
}

//對象創建
Person person=new Person.withAge(20);
Person person=new Person.withInfo("tom",20);
person.printPersonInfo();

除了普通的構造方法外還有一種工廠構造方法,工廠構造方法可以返回一個對象

/**
 * 工廠構造方法,可以返回一個對象
 */
class Looger {
  String name;
  static Map<String, Looger> cache = new Map();

  factory Looger(String name) {
    if (cache.containsKey(name)) {
      return cache[name];
    } else {
      Looger looger = new Looger._internal(name);
      cache[name] = looger;
      return looger;
    }
  }

  //私有構造方法
  Looger._internal(this.name);

  printInfo(msg) {
    print(msg);
  }
}


4.類對象操作符符號

  • ? 判斷對象是否爲空
  • as 對象轉換
  • is 判斷是否屬於某個類型
  • … 級聯調用,類似java中的build模式
class Man {
  String name;
  int age;

  Man(this.name, this.age);

  printManInfo() {
    print("name=$name,age=$age");
  }
}

//對象操作符號
//? 判斷對象是否爲空
  Man man;
  man?.printManInfo();

// as 對象轉換

  var mans;
  mans = "hello";
  mans = new Man("tom", 20);
  (mans as Man).printManInfo();

  //is 判斷是否屬於某個類型

  if (mans is Man) {
    (mans as Man).printManInfo();
  }

  // .. 級聯調用,類似java中的build模式

  Man manss = new Man("tom", 25);
  manss
    ..name = "zhang"
    ..age = 10
    ..printManInfo();
================================
name=tom,age=20
name=tom,age=20
name=zhang,age=10

5.類對象Call方法

編寫call方法可以吧對象看作方法一樣進行調用

class Man {
  String name;
  int age;

  Man(this.name, this.age);

  printManInfo() {
    print("name=$name,age=$age");
  }
  
  void call(){
    print("name=$name,age=$age");
  }
}

  Man man5=new Man("tom", 20);
  man5();
  ===================================
  name=tom,age=20
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章