tft每日頭條

 > 科技

 > dart編譯技術

dart編譯技術

科技 更新时间:2024-12-22 23:55:27

IT技術研習社,專注互聯網技術研究與分享,喜歡的朋友可以點擊【關注】;把經驗傳遞給有夢想的人;

dart編譯技術(Dart的面向對象編程)1

面向對象介紹

Dart是一門使用類和單繼承的面向對象語言,所有的對象都是類的實例,并且所有的類都是Object的子類。本文主要介紹Dart面向對象的編程使用方式。

類的定義

與很多語言一樣,Dart聲明一個對象使用關鍵字class,聲明一個簡單的類代碼如下:

class Person{ String name; int age; sayHello(){ print("Hello, I'm $name, I'm $age old"); } }

上面的Person類中有2個成員變量和一個成員方法。

由于Dart中的類沒有訪問控制權限,可以直接用obj.var的方式訪問一個對象的成員變量。因此用Person類的成員變量或成員方法,可以用下面的代碼:

main(){ Person p = new Person(); // 創建對象 p.sayHello(); // 使用對象方法 }

由于創建時并沒有給Person的屬性進行賦值,因此屬性輸出的值都為null。運行輸出結果如下:

[Running] dart "h:\test.dart" Hello, I'm null, I'm null old, I'm a null [Done] exited with code=0 in 0.962 seconds

構造方法

在構建對象時如果希望同時給對象進行賦值可以使用構造方法

  1. 無參構造方法

class Person{ String name; int age; Person(){ print('在new的時候會被調用'); } sayHello(){ print("Hello, I'm $name, I'm $age old"); } } main(){ Person p; print('new之前'); p = new Person(); print('new之後'); }

從運行結果看到new Person()之後,系統就會自動調用Person的構造函數。如果沒有寫無參的構造方法,系統會自動添加上。

[Running] dart "h:\test.dart" new之前 在new的時候會被調用 new之後 [Done] exited with code=0 in 0.983 seconds

  1. 有參構造方法

如果需要使用有參的構造方法,可以在構造方法的小括号中聲明變量,然後将變量的值賦值給類的成員變量。代碼如下:

class Person{ String name; int age; Person(String name, int age){ print('在new的時候會被調用'); this.name = name; this.age = age; } sayHello(){ print("Hello, I'm $name, I'm $age old"); } } main(){ Person p; print('new之前'); p = new Person(); print('new之後'); }

由于聲明了是帶參數的構造方法,系統就不會自動創建無參的構造方法。所以new的時候不給參數,運行時就會出現如下的錯誤信息。

[Running] dart "h:\test.dart" code.dart:19:17: Error: Too few positional arguments: 2 required, 0 given. p = new Person(); ^ code.dart:5:5: Context: Found this candidate, but the arguments don't match. Person(String name, int age){ ^ [Done] exited with code=254 in 1.036 seconds

正确使用有參構造方法的代碼如下:

main(){ Person p; print('new之前'); p = new Person('李冰冰', 42); print('new之後'); p.sayHello(); }

3. Dart特有的有參構造方法

除了上面聲明有參構造方法以外,Dart還提供了一種簡便的聲明有參構造方法的形式,代碼如下

class Person{ String name; int age; Person(this.name, this.age); sayHello(){ print("Hello, I'm $name, I'm $age old"); } } main(){ Person p = new Person('李冰冰', 42); p.sayHello(); }

運行代碼,輸出的結果是:

[Running] dart "h:\test.dart" Hello, I'm 李冰冰, I'm 42 old, my gender is 女 [Done] exited with code=0 in 0.943 seconds

這種構造方法代碼看起來比較怪異,參數都是以this.開始,并且沒有方法體。這種語法是Dart特有的構造方法聲明方式,實際上等同于以下代碼:

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

命名構造函數

當我們需要定義一個有特别含義的構造函數的時候,可以通過構造函數.XXX來命名構造函數。代碼如下:

class Person{ String name; int age; // 有參的構造方法 Person(this.name, this.age); Person.newIntance(){ print('命名構造函數,函數名可以是任意内容,不是必須叫做newInstance'); } sayHello(){ print("Hello, I'm $name, I'm $age old"); } } main(){ Person p = new Person('李冰冰', 42); // 使用有參的構造方法 p.sayHello(); // 使用命名構造函數 }

類除了有跟類名相同的構造方法外,還可以添加命名的構造方法,如下代碼所示:

class Point { num x, y; Point(this.x, this.y); // 類的命名構造方法 Point.origin() { x = 0; y = 0; } } main() { // 調用Point類的命名構造方法origin() var p = new Point.origin(); var p2 = new Point(10, 10); }

把類單獨抽離成一個模塊

我們可以把類單獨作為一個模塊,通過import引入模塊就可以使用模塊裡面的類。

例如,先創建lib目錄,然後在lib目錄下新建Person.dart文件,文件代碼如下

class Person{ String name; int age; // 有參構造方法簡寫 Person(this.name,this.age); Person.now(){ print('我是命名構造函數'); } Person.setInfo(String name,int age){ this.name=name; this.age=age; } void printInfo(){ print("${this.name}----${this.age}"); } }

在lib目錄外新建測試文件test.dart,代碼如下

import 'lib/Person.dart'; main(){ Person p = new Person.setInfo('李冰冰', 42); p.printInfo(); }

運行代碼,同樣可以正常輸出結果

[Running] dart "h:\code.dart" 李冰冰----42 [Done] exited with code=0 in 0.983 seconds

私有方法和私有屬性

Dart和其他面向對象語言不一樣,Data中沒有public、private、protected這些訪問修飾符合

但是我們可以使用_把一個屬性或者方法定義成私有。

在lib目錄新建Person類,代碼如下:

class Person{ String _name; int age; Person(this._name, this.age); Person.setInfo(String name,int age){ this._name=name; this.age=age; } void printInfo(){ print("${this._name}----${this.age}"); } String getName(){ return this._name; //獲取私有成員變量 } void _cook(){ print('這是一個私有方法'); } void perform(){ this._cook(); //調用私有成員方法 } }

在lib目錄創建測試文件,代碼如下

main(){ Person p = Person.setInfo('李冰冰', 42); print(this._name); }

運行後會出現如下錯誤信息:

[Running] dart "h:\code.dart" code.dart:5:11: Error: The getter '_name' isn't defined for the class 'Person'. - 'Person' is from 'lib/Person.dart'. Try corRecting the name to the name of an existing getter, or defining a getter or field named '_name'. print(p._name); ^^^^^ [Done] exited with code=254 in 1.031 seconds

注意:如果Person類和main放在同一文件或同一目錄下,是可以正确獲取到私有的信息。

getter和setter修飾符

是一種提供對方法屬性讀和寫的特殊方法。每個實例變量都有一個隐式的 getter 方法,合适的話可能還會有 setter 方法。可以通過實現 getters 和 setters 來創建附加屬性,也就是直接使用 get 和 set 關鍵詞:

class Rect{ num height; num width; Rect(this.height,this.width); get area{ // getter return this.height*this.width; } set areaHeight(value){ //setter this.height=value; } } void main(){ Rect r=new Rect(10,4); // print("面積:${r.area()}"); r.areaHeight=6; print(r.area); }

類中的初始化列表

Dart中我們也可以在構造函數體運行之前初始化實例變量,在構造方法的小括号後使用:key1=value1, key2=value2,...key3=value3的形式。

class Rect{ int height; int width; Rect():height=2,width=10{ // 提供默認值 print("${this.height}---${this.width}"); } getArea(){ return this.height*this.width; } } void main(){ Rect r=new Rect(); print(r.getArea()); }

總結

通過前面的學習,我們掌握了怎樣在Dart中聲明一個。掌握了使用無參和有參構造方法,實例化Dart對象。了解怎樣把類做成模塊化,如何将成員變量和成員方法設置為私有的形式。通過getter和setter對私有的成員變量進行數據的獲取和修改。

,

更多精彩资讯请关注tft每日頭條,我们将持续为您更新最新资讯!

查看全部

相关科技资讯推荐

热门科技资讯推荐

网友关注

Copyright 2023-2024 - www.tftnews.com All Rights Reserved