dart類詳細講解


dart 是一個面向對象的語言;面向對象有 (1)繼承  (2)封裝   (3)多態
dart的所有東西都是對象,所有的對象都是繼承與object類
一個類通常是由屬性和方法組成的哈;
在dart中如果你要自定義一個類的話,將這個類放在main函數外面哈
類名使用大駝峰
方法名使用小駝峰

1 定義這個類的屬性和方法

//定義一個類的屬性和方法
class Person {
  String name = '張三';
  int age = 19;
  void getInfo() {
    // print('我叫$name,今年$age');第一種
    //推薦使用這樣的寫,通過this去訪問
    print("${this.name}====${this.age}");
  }
}

//使用類中的屬性和方法
void main() {
  // 調用Perso這個類  首先需要實例化這個類
  //  Person p = new Person(); // 等價 var p=new Person
  var p = new Person();
  print(p.age);
  p.getInfo();
}

2 改變類中的屬性和方法

class Person {
  String name = '張三';
  int age = 19;
  void getInfo() {
    //推薦使用這樣的寫法
    print("${this.name}====${this.age}");
  }
  //限制類型,更改類中的屬性和方法
  SetUserinfo(int age) {
    this.age = age;
  }
}

void main() {
  // 調用Perso這個類  首先需要實例化這個類
  Person p = new Person(); // 等價 var p=new Person
  print(p.age);//19
  p.getInfo();//張三====19
  p.SetUserinfo(100);
  p.getInfo();//張三====100
}

3默認構造函數

class Person {
    //這是一個默認構造函數
  Person() {
    print('默認構造函數里面的內容,該方法在實例化的時候會自動出發哈');
  }
}

void main() {
  // 實例化的時候,會自動觸發默認構造函數
  Person p = new Person(); // 等價 var p=new Person
}

4 動態傳遞,類多次實例化,打印不同的值

class Person {
  String name;
  int age;
  Person(String name, int age) {
    this.name = name;
    this.age = age;
  }
  void getuserInfo() {
    print(this.name);
    print(this.age);
  }
}

void main() {
  // 實例化的時候,會自動觸發
  Person p = new Person('張三', 10); // 等價 var p=new Person
  p.getuserInfo();

  //這個類可以實例化多次的哈
  Person v = new Person('張三1', 100); // 等價 var p=new Person
  v.getuserInfo();
}

5默認構造函數簡寫

class Person {
  String name;
  int age;
 
 // Person(String name, int age) {
 //   this.name = name;
 //   this.age = age;
 // }
 //上面注釋的代碼等價於  Person(this.name, this.age);
 Person(this.name, this.age);
  void getuserInfo() {
    print(this.name);
    print(this.age);
  }
}

6命名構造函數,命名構造函數是可以寫多個的;但是默認構造函數只能寫一個

class Person {
  //我是默認的構造函數
  Person() {
    print('我是默認的構造函數');
  }
  // 命名構造函數
  Person.mynow() {
    print('我是命名構造函數');
  }
}

void main() {
  // 實例化的時候,會默認構造自動觸發
  Person p = new Person(); // 等價 var p=new Person
  Person v = new Person.mynow(); // 觸發命名構造函數
}

7將類抽離出去,單獨放一個文件夾中

在項目的根目錄創建一個文件夾 lib
在lib文件夾中創建一個文件 xxx.dart內容如下

class Person {
  //我是默認的構造函數
  Person() {
    print('我是默認的構造函數');
  }
  // 命名構造函數
  Person.mynow() {
    print('我是命名構造函數');
  }
}


在需要的某個文件中引入
import 'lib/xxx.dart';
void main() {
  // 實例化的時候,會默認構造自動觸發
  Person p = new Person(); // 等價 var p=new Person
  Person v = new Person.mynow(); // 觸發命名構造函數
}

8dart修飾符

dart和其他面向對象的語言不一樣。沒有向public  private 這樣的訪問修飾符
但是我們可以使用_把一個屬性或者方法定義成私有的哈;
(就是在變量或者方法的前面添加_;並且要單獨把他抽離出去變成一個文件  放在lib目錄下,這樣外面就不能夠訪問了);
但是個人覺得這種沒有實質的意義
如果要訪問這個私有的方法,那么在類種添加一個共有的方法;去訪問這個私有的方法;訪問在return回去;
就可以訪問這個私有的方法了
私有方法,只有在當前類中訪問哈

在lib目錄下的animal.dart文件;內容如下

class Animal {
  String _name = 'dog';//這是私有的方法,只當前這個類可以訪問;其他類是不能夠訪問的哈~;
  // 如果非要訪問這個類,可以通過共有方法來訪問
  
  // 通過公共方法來訪問這個類;間接訪問
  getName(){
    print(this._name);
  }

  int age = 19;
  void getInfo() {
    //推薦使用這樣的寫法
    print("${this._name}====${this.age}");
  }

  //限制類型,更改類中的屬性和方法
  SetUserinfo(int age) {
    this.age = age;
  }
}

9 計算矩形的面積將他改為get方法

class Rect {
  num width;
  num height;
  Rect(this.width, this.height);
  getUserINfo() {
    return (this.width * this.height);
  }
}

void main() {
  // 實例化的時候,會默認構造自動觸發
  Rect p = new Rect(10, 4); // 等價 var p=new Person
  print(p.getUserINfo());
}

將上面的代碼改為get方法

class Rect {
  num width;
  num height;
  Rect(this.width, this.height);
  // getUserINfo() {
  //   return (this.width * this.height);
  // }

  // 將上面的代碼該為get
  get getUserINfo {
    return (this.width * this.height);
  }
}

void main() {
  // 實例化的時候,會默認構造自動觸發
  Rect p = new Rect(10, 4);
  // print(p.getUserINfo());
  // 將上面的代碼改為get方法的調用
  print(p.getUserINfo);//調用的時候直接通過訪問屬性的方式訪問方法
}

09dart 中的set 方法

class Rect {
  num width;
  num height;
  Rect(this.width, this.height);
  // 設置值的時候。我們使用了set方法
  set areaHeight(value) {
    this.height = value;
  }
  get area {
    return this.height;
  }
}
void main() {
  // 實例化的時候,會默認構造自動觸發
  Rect p = new Rect(10, 4);
  p.areaHeight = 6; //當一個類的內部使用了set方法的時候。我們直接使用賦值;
  print(p.area); //內部使用了get  我們這直接通過屬性獲取值
}

10在實例化之前,給類內部初始化數值

class Rect {
  num width;
  num height;
  // 在實例化之前,給類內部初始化數值
  Rect()
      : height = 2,
        width = 10 {}
  get area {
    return this.height * this.width;
  }
}

void main() {
  // 實例化的時候,會默認構造自動觸發
  Rect p = new Rect();
  print(p.area); //內部使用了get  我們這直接通過屬性獲取值
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM