讀編程與型別系統筆記07_子型別
2023-01-15 07:42:35 軟體設計

1. 子型別
1.1. 在期望型別T的實體的任何地方,都可以安全地使用型別S的實體,則型別S是型別T的子型別
1.1.1. 里氏替換原則(Liskov substitution principle)
2. 名義子型別
2.1. 明確指定
2.2. 顯式宣告一個型別是另一個型別的子型別
2.3. 大部分主流編程語言采用的方式
2.3.1. Java
2.3.2. C#
2.4. TypeScript通過使用unique symbol可以模擬名義子型別
3. 結構子型別
3.1. 型別具有相同的結構
3.2. 不需要顯式宣告子型別關系
3.3. 一個型別的結構與另一個型別相似(具有相同的成員,可能還有額外的成員),自動被視為后者的子型別
3.4. TypeScript使用結構子型別
3.5. 即使型別不在我們的控制范圍內,我們在型別之間仍然能建立關系
3.5.1. 例如:我們不能修改的來自外部庫的一個型別
4. 極端情況
4.1. 頂層型別
4.1.1. 把任何東西賦值給它的型別
4.1.1.1. 用來存盤任何東西
4.1.1.2. C#的Object
4.1.1.3. TypeScript的unknown
4.1.1.3.1. null的型別是null
4.1.1.3.2. undefined的型別是undefined
4.1.1.3.3. Object
4.1.1.3.4. 三者和型別即unknown
4.1.1.3.4.1. Object | null |undefined
4.1.1.3.5. 只有當我們確認一個值具有某個型別時,才能把該值用作該型別
4.1.1.3.5.1. C#提供了is關鍵字
4.1.1.3.5.2. Java則提供了instanceof
4.1.2. 其他任何型別的父型別
4.1.3. 位于子型別層次結構的頂端
4.2. 底層型別
4.2.1. 可以賦值給任何東西的型別
4.2.1.1. 沒有某種型別的實體可用
4.2.1.2. TypeScript的never
4.2.2. 其他任何型別的子型別
4.2.3. 位于子型別層次結構的底端
4.2.4. 始終是一個空型別:這是我們不能為其創建實際值的型別
4.2.5. 允許我們假裝有任何型別的一個值,即使我們并不能生成這個值
4.2.6. 很少有主流語言提供底層型別
4.2.6.1. 使一個型別成為空型別,但不能使其成為底層型別
4.2.6.2. 除非在編譯器中實作,否則我們無法自定義底層型別
5. 和型別
5.1. 父型別比子型別的型別更多
5.1.1. 例如:Triangle | Square是Triangle | Square | Circle的子型別
5.2. Variant能夠封裝幾個型別中某個型別的值,但是它本身不是其中任何一個型別
6. 可變性
6.1. 協變性
6.1.1. 一個型別保留其底層型別的子型別關系
6.1.2. 陣列具有協變性,因為它保留了子型別關系
6.1.3. 當處理集合(如LinkedList)時,不同的語言具有不同的行為
6.1.3.1. 在C#中,必須通過宣告介面并使用out關鍵字(ILinkedList),顯式指出一個型別(如LinkedList)的協變
6.1.4. 函式的回傳型別具有協變性
6.2. 逆變性
6.2.1. 一個型別顛倒了其底層型別的子型別關系
6.2.2. 大部分編程語言中,函式的實參是逆變的
6.2.2.1. TypeScript是一個例外
6.2.2.1.1. 故意做出的設計決策
6.3. 雙變性
6.3.1. 型別的底層型別的子型別關系決定了它們互為子型別
6.3.2. 在TypeScript中函式實參的雙變性可能導致錯誤的代碼通過編譯
6.4. 不變性
6.4.1. 一個型別不考慮其底層型別的子型別關系
6.4.2. C#中的List具有不變性
7. any型別
7.1. 可以把任何值賦值給any
7.2. 可以把any值繞過型別檢查賦值給其他任何型別
7.3. 會繞過型別檢查立即把該值用作其他任何型別的值
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/542024.html
標籤:設計模式
上一篇:(Java)設計模式:結構型
下一篇:大牛架構師珍藏的10條編程原則
-
- 標籤雲
-
-
- 熱門瀏覽
-
-
面試突擊第一季,第二季,第三季
第一季必考 https://www.bilibili.com/video/BV1FE411y79Y?from=search&seid=15921726601957489746 第二季分布式 https://www.bilibili.com/video/BV13f4y127ee/?spm_id_fro ......
uj5u.com 2020-09-10 05:35:24 more
-
第三單元作業總結
1.前言 這應該是本學期最后一次寫作業總結了吧。總體來說,對作業的節奏也差不多掌握了,作業做起來的效率也更高了。雖然和之前的作業一樣,作業中都要用到新的知識,但是相比之前,更加懂得了如何利用工具以及資料。雖然之間卡過殼,但總體而言,這幾次作業還算完成的比較好。 2.作業程序總結 相比前兩個單元,此單 ......
uj5u.com 2020-09-10 05:35:41 more
-
北航OO(2020)第四單元博客作業暨課程總結博客
北航OO(2020)第四單元博客作業暨課程總結博客 本單元作業的架構設計 在本單元中,由于UML圖具有比較清晰的樹形結構,因此我對其中需要進行查詢操作的元素進行了包裝,在樹的父節點中存盤所有孩子的參考。考慮到性能問題,我采用了快取機制,一次查詢后盡可能快取已經遍歷過的資訊,以減少遍歷次數。 本單元我 ......
uj5u.com 2020-09-10 05:35:48 more
-
BUAA_OO_第四單元
一、UML決議器設計 ? 先看下題目:第四單元實作一個基于JDK 8帶有效性檢查的UML(Unified Modeling Language)類圖,順序圖,狀態圖分析器 MyUmlInteraction,實際上我們要建立一個有向圖模型,UML中的物件(元素)可能與同級元素連接,也可與低級元素相連形成 ......
uj5u.com 2020-09-10 05:35:54 more
-
6.1邏輯運算子
邏輯運算子 1. && 短路與 運算式1 && 運算式2 01.運算式1為true并且運算式2也為true 整體回傳為true 02.運算式1為false,將不會執行運算式2 整體回傳為false 03.只要有一個運算式為false 整體回傳為false 2. || 短路或 運算式1 || 運算式2 ......
uj5u.com 2020-09-10 05:35:56 more
-
BUAAOO 第四單元 & 課程總結
1. 第四單元:StarUml檔案決議 本單元采用了圖模型決議UML。 UML檔案可以抽象為圖、子圖、邊的邏輯結構。 在實作中,圖的節點包括類、介面、屬性,子圖包括狀態圖、順序圖等。 采用了三次遍歷UML元素的方法建圖,第一遍遍歷建點,第二、三次遍歷設定屬性、連邊,實作圖物件的初始化。這里借鑒了一些 ......
uj5u.com 2020-09-10 05:36:06 more
-
談談我對C# 多型的理解
面向物件三要素:封裝、繼承、多型。 封裝和繼承,這兩個比較好理解,但要理解多型的話,可就稍微有點難度了。今天,我們就來講講多型的理解。 我們應該經常會看到面試題目:請談談對多型的理解。 其實呢,多型非常簡單,就一句話:呼叫同一種方法產生了不同的結果。 具體實作方式有三種。 一、多載 多載很簡單。 p ......
uj5u.com 2020-09-10 05:36:09 more
-
Python 資料驅動工具:DDT
背景 python 的unittest 沒有自帶資料驅動功能。 所以如果使用unittest,同時又想使用資料驅動,那么就可以使用DDT來完成。 DDT是 “Data-Driven Tests”的縮寫。 資料:http://ddt.readthedocs.io/en/latest/ 使用方法 dd. ......
uj5u.com 2020-09-10 05:36:13 more
-
Python里面的xlrd模塊詳解
那我就一下面積個問題對xlrd模塊進行學習一下: 1.什么是xlrd模塊? 2.為什么使用xlrd模塊? 3.怎樣使用xlrd模塊? 1.什么是xlrd模塊? ?python操作excel主要用到xlrd和xlwt這兩個庫,即xlrd是讀excel,xlwt是寫excel的庫。 今天就先來說一下xl ......
uj5u.com 2020-09-10 05:36:28 more
-
當我們創建HashMap時,底層到底做了什么?
jdk1.7中的底層實作程序(底層基于陣列+鏈表) 在我們new HashMap()時,底層創建了默認長度為16的一維陣列Entry[ ] table。當我們呼叫map.put(key1,value1)方法向HashMap里添加資料的時候: 首先,呼叫key1所在類的hashCode()計算key1 ......
uj5u.com 2020-09-10 05:36:38 more
-
- 最新发布
-
-
-
露天煤礦現場調研和交流案例分享
他們集團的資訊化公司及研究院在一個礦區正在做智能礦山的統一平臺的 試點,專案投資大概1億,包括了礦山的各方面的內容,顯示得我們這次交流有點多余。他們2年前開始做智能礦山的規劃,有很多煤礦行業專家的加持,他們的描述是非常完美,但是去年底應該上線的平臺,現在還沒有看到影子。他們確實有很多場景需求,但是被... ......
uj5u.com 2023-04-20 08:20:25 more
-
-
軟體架構生態化-多角色交付的探索實踐
作為一個技術架構師,不僅僅要緊跟行業技術趨勢,還要結合研發團隊現狀及痛點,探索新的交付方案。在日常中,你是否遇到如下問題 “ 業務需求排期長研發是瓶頸;非研發角色感受不到研發技改提效的變化;引入ISV 團隊又擔心質量和安全,培訓周期長“等等,基于此我們探索了一種新的技術體系及交付方案來解決如上問題。 ......
uj5u.com 2023-04-20 08:20:10 more
-
-
露天煤礦現場調研和交流案例分享
他們集團的資訊化公司及研究院在一個礦區正在做智能礦山的統一平臺的 試點,專案投資大概1億,包括了礦山的各方面的內容,顯示得我們這次交流有點多余。他們2年前開始做智能礦山的規劃,有很多煤礦行業專家的加持,他們的描述是非常完美,但是去年底應該上線的平臺,現在還沒有看到影子。他們確實有很多場景需求,但是被... ......
uj5u.com 2023-04-20 08:19:07 more
-
-
軟體架構生態化-多角色交付的探索實踐
作為一個技術架構師,不僅僅要緊跟行業技術趨勢,還要結合研發團隊現狀及痛點,探索新的交付方案。在日常中,你是否遇到如下問題 “ 業務需求排期長研發是瓶頸;非研發角色感受不到研發技改提效的變化;引入ISV 團隊又擔心質量和安全,培訓周期長“等等,基于此我們探索了一種新的技術體系及交付方案來解決如上問題。 ......
uj5u.com 2023-04-20 08:18:49 more
-
05單件模式
#經典的單件模式 public class Singleton { private static Singleton uniqueInstance; //一個靜態變數持有Singleton類的唯一實體。 // 其他有用的實體變數寫在這里 //構造器宣告為私有,只有Singleton可以實體化這個類! ......
uj5u.com 2023-04-19 08:42:51 more
-
【架構與設計】常見微服務分層架構的區別和落地實踐
軟體工程的方方面面都遵循一個最基本的道理:沒有銀彈,架構分層模型更是如此,每一種都有各自優缺點,所以請根據不同的業務場景,并遵循簡單、可演進這兩個重要的架構原則選擇合適的架構分層模型即可。 ......
uj5u.com 2023-04-19 08:42:41 more
- 友情鏈接
-
-