dart學習記錄5(類、對象)

1.獲取運行時對象類型

使用Object 屬性的 runtimeType,它返回一個 Type 對象。

print('a 的類型是 ${a.runtimeType}');

??警告

在測試對象的類型時建議使用object is Type比測試 object.runtimeType == Type 更穩定。

2.實例變量的聲明

class Point {double? x; // 聲明實例變量 x,初始值為 null。double? y; // 聲明 y,初始值為 null。double z = 0; // 聲明 z,初始值為 0。
}

所有實例變量都會生成一個隱式的 getter 方法。非final的實例變量,以及未初始化的late final實例變量,都會生成一個隱式的setter方法。

class Point {double? x; // 聲明實例變量 x,初始值為 null。double? y; // 聲明 y,初始值為 null。
}void main() {var point = Point();point.x = 4; // 使用 x 的 setter 方法。assert(point.x == 4); // 使用 x 的 getter 方法。assert(point.y == null); // 默認值為 null。
}

在聲明時初始化非 late 實例變量會在實例創建時設置值,在構造函數及其初始化列表執行之前。因此,非 late 實例變量的初始化表達式(= 之后的表達式)無法訪問 this。

double initialX = 1.5;class Point {// 可以訪問不依賴 `this` 的聲明:double? x = initialX;// 錯誤,在非 `late` 初始化器中無法訪問 `this`:double? y = this.x;// 可以,在 `late` 初始化器中訪問 `this`:late double? z = this.x;// 可以,`this.x` 和 `this.y` 是參數聲明,不是表達式:Point(this.x, this.y);
}

實例變量可以是 final 的,在這種情況下它們必須被設置且僅設置一次。可以在聲明時使用構造函數參數或者使用構造函數的初始化列表來初始化final類型的非late實例變量。

class ProfileMark {final String name;final DateTime start = DateTime.now();ProfileMark(this.name);	//使用構造函數參數,來初始化final類型的非late實例變量ProfileMark.unnamed() : name = '';	//使用構造函數的初始化列表,來初始化final類型的非late實例變量
}

如果您需要在構造函數體開始后為 final 實例變量賦值,可以使用以下方法之一:

  • 使用工廠構造函數。
  • 使用 late final,但要小心:沒有初始值設定器的late final會為 API 添加一個 setter。

3.隱式接口

每個類都隱式地定義了一個接口,該接口包含該類的所有實例成員以及它所實現的任何接口的實例成員。如果你想創建一個支持類 B 的應用程序編程接口(API)但又不繼承 B 的實現的類 A,那么類 A 應該實現 B 接口。

implements 關鍵字主要用于類實現接口

  • 概念:接口規定了一組方法的簽名,不過不包含具體實現。類借助 implements 關鍵字來實現接口時,就必須實現接口里定義的所有方法

  • 使用方法:在類定義時,運用 implements 關鍵字,后面緊跟一個或多個接口名,若有多個接口,用逗號分隔。類需要實現接口中定義的所有方法。

  • 示例

// 定義一個接口
abstract class Animal {void eat();void sleep();
}// 實現接口的類
class Dog implements Animal {void eat() {print('Dog is eating.');}void sleep() {print('Dog is sleeping.');}
}void main() {Dog dog = Dog();dog.eat();dog.sleep();
}

在上述代碼中,Animal 是一個接口,定義了 eat 和 sleep 方法。Dog 類使用 implements 關鍵字實現了 Animal 接口,并且實現了接口中定義的所有方法。

與 extends 的區別

  • extends:用于類的繼承,一個類只能單繼承,子類會繼承父類的實現。
  • implements:用于實現接口,一個類可以實現多個接口,類需要自己實現接口中定義的所有方法

一個類通過在 implements 子句中聲明一個或多個接口,然后提供這些接口所要求的 API 來實現它們。

以上來自AI的解釋,下面是dart官方文檔的
類通過在 implements 子句中聲明一個或多個接口并提供接口所需的 API 來實現它們。例如:

// 一個 person類. 包含一個隱式接口greet().
class Person {// 在接口中,但僅在此類中可見.final String _name;// 不在接口中,因為這是一個構造函數.Person(this._name);// 在接口中.String greet(String who) => 'Hello, $who. I am $_name.';
}// Person 接口的一個實現類.
class Impostor implements Person {String get _name => '';String greet(String who) => 'Hi $who. Do you know who I am?';
}String greetBob(Person person) => person.greet('Bob');void main() {print(greetBob(Person('Kathy')));	//你好,Bob。我是 Kathyprint(greetBob(Impostor()));	//嗨 Bob。你知道我是誰嗎?
}

4.類變量和方法

使用 static 關鍵字來實現類級的變量和方法。

  • 靜態變量
    靜態變量(類變量)對于類范圍的狀態和常量非常有用
class Queue {static const initialCapacity = 16;// ···
}void main() {assert(Queue.initialCapacity == 16);	//靜態成員/方法無需創建實例,直接訪問/調用
}

靜態變量只有在使用時才會被初始化

  • 靜態方法
    靜態方法(類方法)不作用于實例,因此無法訪問 this。但是,它們可以訪問靜態變量。如下例所示,您直接在類上調用靜態方法:
import 'dart:math';class Point {double x, y;Point(this.x, this.y);static double distanceBetween(Point a, Point b) {var dx = a.x - b.x;var dy = a.y - b.y;return sqrt(dx * dx + dy * dy);}
}void main() {var a = Point(2, 2);var b = Point(4, 4);var distance = Point.distanceBetween(a, b);assert(2.8 < distance && distance < 2.9);print(distance);
}

??注意

對于常用或廣泛使用的工具和功能,考慮使用頂級函數,而不是靜態方法。
您可以將靜態方法用作編譯時常量。例如,您可以將靜態方法作為參數傳遞給常量構造函數。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/74082.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/74082.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/74082.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

啟明星辰春招面試題

《網安面試指南》https://mp.weixin.qq.com/s/RIVYDmxI9g_TgGrpbdDKtA?token1860256701&langzh_CN 5000篇網安資料庫https://mp.weixin.qq.com/s?__bizMzkwNjY1Mzc0Nw&mid2247486065&idx2&snb30ade8200e842743339d428f414475e&chksmc0e4732df793fa3bf39…

Live555+Windows+MSys2 編譯Androidso庫和運行使用

下載 wget http://www.live555.com/liveMedia/public/live555-latest.tar.gz tar -xzvf live555-latest.tar.gz加入版本控制 git init git add . git commit -a -m "first init" git log修改config.android-arm64 cd live vim config.android-arm64 ./genMakefile…

實用工具-Stirling-PDF

windows桌面版參考這個文檔 Getting Started | Stirling-PDF 安裝包推薦使用迅雷下載&#xff0c;先轉存到迅雷網盤在使用迅雷下載速度嘎嘎快。 github:https://github.com/Stirling-Tools/Stirling-PDF Stirling-PDF 是一個強大的、基于 Web 的開源 PDF 處理工具&#xff0c…

借助AI Agent實現數據分析

在當今數據驅動的世界中&#xff0c;數據分析已成為企業決策、科學研究和社會治理的核心工具。然而&#xff0c;隨著數據量的爆炸式增長和復雜性的提升&#xff0c;傳統的數據分析方法面臨著效率低下、成本高昂和人力不足等挑戰。AI技術的快速發展&#xff0c;尤其是AI Agent的…

JavaScript實現一個函數,將數組扁平化(flatten),即把多維數組轉為一維數組。

大白話實現一個函數&#xff0c;將數組扁平化&#xff08;flatten&#xff09;&#xff0c;即把多維數組轉為一維數組。 思路 實現數組扁平化的基本思路是遍歷數組中的每個元素&#xff0c;如果元素是數組&#xff0c;就遞歸地將其扁平化并添加到結果數組中&#xff1b;如果元…

麒麟操作系統安裝人大金倉數據庫

如果你想擁有你從未擁有過的東西&#xff0c;那么你必須去做你從未做過的事情 在當前數字化轉型和信息安全備受重視的背景下&#xff0c;眾多公司積極推進國產化改造進程。在操作系統領域&#xff0c;統信、open 歐拉、中標麒麟、銀河麒麟等國產操作系統嶄露頭角&#xff0c;逐…

開發SAPUI5 Fiori應用并部署到SAP系統

首先新建一個項目文件夾 在VScode中打開 打開SAP Fiori&#xff08;需要先下載安裝&#xff0c;參考上上一篇文章&#xff09; ,選擇已添加的SAP S4 ERP系統 ,點擊創建Firoi應用。 如果沒有添加系統的&#xff0c;點擊添加按鈕&#xff0c;添加即可&#xff0c;注意&#xff…

右鍵添加:新建HTML模板文件

使用注冊表給Windows右鍵添加:新建HTML文檔模板的功能_注冊表右鍵新建-CSDN博客 新建文件有了&#xff0c;但是沒有引用模板文件&#xff0c;是空文件。 默認改成 htmlfile 模板成功

[極客大挑戰 2019]Knife——3.20BUUCTF練習day4(1)

[極客大挑戰 2019]Knife——3.20BUUCTF練習day4(1) 很簡單 蟻劍連接 根目錄下有flag flag{f77e8444-dd87-48b3-8fe0-a735b5a5c708}

力扣22.括號生成

22. 括號生成 - 力扣&#xff08;LeetCode&#xff09; 代碼區&#xff1a; class Solution {vector<string> ans; public:vector<string> generateParenthesis(int n) {dfs(0,0,n,"");return ans;}void dfs(int left,int right,int n,string str){if(l…

第37周:文獻閱讀

目錄 摘要 Abstract 文獻閱讀 問題引入 研究背景 研究意義 研究目的 實驗方法 TimeGAN 數據增強 預測模型的獨立性 創新點 實驗研究 數據準備 合成數據分析 模型比較 總結 摘要 該文獻圍繞利用 TimeGAN 提高供熱變電站熱負荷預測精度展開。結構上&#x…

NFS 安裝與測試

NFS 安裝與測試 服務器 # NFS 共享目錄 mkdir -p ${HOME}/Share/nfs && sudo chown -R nobody:nogroup ${HOME}/Share/nfs# 安裝 NFS Server sudo apt install nfs-kernel-server# 配置 NFS 目錄 sudo cp -arf /etc/exports /etc/exports.bak sudo tee -a /etc/exports…

算法題(103):數獨

審題&#xff1a; 本題需要我們找出數獨的解&#xff0c;并打印出來 時間復雜度分析&#xff1a; 本題是9*9的數獨格子&#xff0c;所以數據量小于25&#xff0c;可以使用2^n的算法 思路&#xff1a; 方法一&#xff1a;深度優先搜索 首先確定搜索及插入策略&#xff1a; 我們采…

snmp/mib采用子代理模式,編碼,部署

0.環境 0.1 編譯net-snmp cd net-snmp-5.7.2 ./configure --prefix/usr/local/snmp BEGIN failed--compilation aborted at Makefile.PL line 1. make: *** [perlmakefiles] Error 2 yum install cpan -y make && make install /…

# [RPA] 使用八爪魚進行高效網頁數據采集

在許多行業中&#xff0c;數據是核心資產。然而&#xff0c;雖然許多網站的文本內容可以免費訪問&#xff0c;但手動一條一條采集&#xff0c;不僅耗時耗力&#xff0c;還容易出錯。這種情況下&#xff0c;使用自動化工具來提高采集效率就顯得尤為重要。本文將介紹 八爪魚 這一…

IDI_APPLICATION 與 IDC_ARROW資源存放在工程的哪個路徑?

書籍&#xff1a;《windows程序設計(第五版)》的開始 環境&#xff1a;visual studio 2022 內容&#xff1a;HELLOWIN程序 說明&#xff1a;以下內容大部分來自騰訊元寶。 IDI_APPLICATION 和 IDC_ARROW 是 ?Windows 系統預定義的資源標識符&#xff0c;它們并不以文件形式…

算法 | 優化算法比較

===================================================== github:https://github.com/MichaelBeechan CSDN:https://blog.csdn.net/u011344545 ===================================================== 優化算法 ?一、主流優化算法分類?1?、傳統梯度類算法?2?、啟發式算…

騰訊云HAI1元體驗:輕松調用DeepSeek-R1模型搭建網站

前言 隨著云計算和人工智能技術的不斷發展&#xff0c;構建和部署智能化的網頁變得越來越簡單。騰訊云提供的HAI&#xff08;人工智能平臺&#xff09;和DeepSeek&#xff08;智能搜索引擎&#xff09;服務&#xff0c;能幫助開發者快速搭建智能化網頁&#xff0c;提升用戶體驗…

AI Agent系列(七) -思維鏈(Chain of Thought,CoT)

AI Agent系列【七】 前言一、CoT技術詳解1.1 CoT組成1.2 CoT的特點 二、CoT的作用三、CoT的好處四、CoT適用場景五、CoT的推理結構 前言 思維鏈(Chain of Thought,CoT)&#xff0c;思維鏈就是一系列中間的推理步驟(a series of intermediate reasoning steps)&#xff0c;通過…

【一起來學kubernetes】21、Secret使用詳解

Secret 的詳細介紹 Secret 是 Kubernetes 中用于存儲和管理敏感信息&#xff08;如密碼、令牌、密鑰等&#xff09;的資源對象。Secret的設計目的是為了安全地存儲和傳輸敏感信息&#xff0c;如密碼、API密鑰、證書等。這些信息通常不應該直接硬編碼在配置文件或鏡像中&#x…