c#面向對象:接口詳解

接口(interface)

抽象類中的抽象方法只規定了不能是 private 的,而接口中的“抽象方法”只能是 public 的。
這樣的成員訪問級別就決定了接口的本質:接口是服務消費者和服務提供者之間的契約。
既然是契約,那就必須是透明的,對雙方都是可見的。
除了 public,abstract 的抽象方法還可以是 protected 和 internal,它們都不是給功能調用者準備的,各自有特定的可見目標。

接口即契約(contract)
契約使自由合作成為可能,所謂自由合作就是一份合同擺在這里,它即約束服務的使用者也約束服務的提供者。如果該契約的使用者和提供者有多個,它們之間還能自由組合

示例推導

重載

同一個方法名被用于定義多個方法,但這些方法具有不同的參數列表(參數的數量、類型或參數的修飾符如ref、out、params等)。
當調用一個方法時,編譯器會根據提供的參數類型和數量來確定應該調用哪個版本的方法。

 class Program{static void Main(string[] args){int[] nums1 = new int[] { 1, 2, 3, 4, 5 };ArrayList nums2 = new ArrayList { 1, 2, 3, 4, 5 };Console.WriteLine(Sum(nums1));Console.WriteLine(Sum(nums2));}// 計算和:該Sum()只能計算int類型的數組和// 不能計算nums2的object類型,需要用重載,兩個Sum()static int Sum(int[] nums){int sum = 0;foreach (var item in nums){               sum += item;}return sum;}static int Sum(ArrayList nums){int sum = 0;foreach (var item in nums){sum += (int)item; // 強制轉換為 int 類型}return sum;}}

接口版

int 整型數組的基類是 Array,F12可知其實現了接口 IEnumerable
ArrayList 也實現了接口 IEnumerable ,都遵守契約 IEnumerable
兩個方法只要求能被迭代即可,就可以把具體類型換成接口 IEnumerable

// 使用接口,只寫一次方法即可
static int Sum(IEnumerable nums){int sum = 0;foreach (var item in nums){sum += (int)item; // 強制轉換為 int 類型}return sum;}

依賴和耦合

現實中有分工、合作,面向對象是對現實的抽象,也有分工、合作。
在面向對象中,合作的專業術語叫“依賴”,依賴的同時就有了耦合,依賴越直接,耦合就越緊。

高內聚低耦合
內聚性:又稱塊內聯系。指模塊的功能強度的度量,即一個模塊內元素彼此之間結合的緊密程度的度量。若一個程序之間各元素之間(程序段之間)聯系緊密,則內聚性就高(高內聚)。
耦合性:又稱塊間聯系。指軟件系統各模塊之間相互緊密聯系程度的一種度量。模塊之間聯系越緊密,其耦合性就越強,模塊的獨立性就越差。相反其耦合性就越弱(低耦合)。

Car 和 Engine 的緊耦合示例

 class Car與Engine緊耦合{static void Main(string[] args){var engine = new Engine();Car car = new Car(engine);car.Run(3);Console.WriteLine(car.Speed);}class Engine{public int PRM { get; set; } // 設置屬性“引擎轉數”public void Work(int gas) // gas:汽油{this.PRM = 1000 * gas;}}class Car{// Car 類里有 Engine 類型的字段,它倆就是緊耦合了// Car 依賴于 Engineprivate Engine _engine;public int Speed { get; set; }// // 當創建一個新的 Car 對象時,必須為這個構造函數提供一個 Engine 對象。public Car(Engine engine) {_engine = engine;}public void Run(int gas){_engine.Work(gas);this.Speed = _engine.PRM / 100; // 速度}}}

緊耦合的問題:

  1. 基礎類一旦出問題,上層類寫得再好也沒轍
  2. 程序調試時很難定位問題源頭
  3. 基礎類修改時,會影響寫上層類的其他程序員的工作

所以程序開發中要盡量避免緊耦合,解決方法就是接口。
接口:

  1. 約束調用者只能調用接口中包含的方法
  2. 讓調用者放心去調,不必關心方法怎么實現的、誰提供的
接口解耦示例

以老式手機舉例,對用戶來說他只關心手機可以接、打電話和收、發短信。
對于手機廠商,接口約束了他只要造的是手機,就必須可靠實現上面的四個功能。

用戶如果丟了個手機,他只要再買個手機,不必關心是那個牌子的,肯定也包含這四個功能,上手就可以用。用術語來說就是“人和手機是解耦的”。

class Program{static void Main(string[] args){}class PhoneUser{private Iphone _iphone;public PhoneUser(Iphone iphone){_iphone = iphone;}public void UsePhone(){_iphone.Dail();_iphone.PickUp();}}interface Iphone{void Dail(); // 打void PickUp(); // 接}class HuaWeiPhone:Iphone{public void Dail(){Console.WriteLine("HuaWei is calling");}public void PickUp(){Console.WriteLine("Hello!This is HuaWei");}}class XiaoMiPhone:Iphone{public void Dail(){Console.WriteLine("XiaoMi is calling");}public void PickUp(){Console.WriteLine("Hello!This is XiaoMi");}}}
  • 沒有用接口時,如果一個類壞了,你需要 Open 它再去修改,修改時可能產生難以預料的副作用。引入接口后,耦合度大幅降低,換手機只需要換個類名,就可以了。
  • 等學了反射后,連這里的一行代碼都不需要改,只要在配置文件中修改一個名字即可。
  • 在代碼中只要有可以替換的地方,就一定有接口的存在;接口就是為了解耦(松耦合)而生。
  • 松耦合最大的好處就是讓功能的提供方變得可替換,從而降低緊耦合時“功能的提供方不可替換”帶來的高風險和高成本。

高風險:功能提供方一旦出問題,依賴于它的功能都掛
高成本:如果功能提供方的程序員崩了,會導致功能使用方的整個團隊工作受阻

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

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

相關文章

攻防實戰 | 郵件高級威脅檢測與自動化響應

歷經三個月的時間,年度重磅直播節目Fortinet 2024年度“Demo季”近日終于迎來了備受矚目的壓軸大戲——Demo Day第三期,主題為《新郵件安全下的高級威脅檢測與自動化響應》。繼成功舉辦了前兩期《企業網絡中的多源威脅情報自動化整合與集成》和《應急響應…

【持久層】在Spring Boot中使用Hibernate和Gradle構建項目

Hibernate是一個廣泛使用的Java持久化框架,它使得Java對象與關系數據庫之間的映射變得簡單高效。在Spring Boot應用中,結合Gradle構建工具,能夠方便地集成和使用Hibernate。本文將簡述如何在Spring Boot中使用Hibernate,并通過Gra…

Pycharm使用時的紅色波浪線報錯——形如‘break‘ outside loop

背景: 我在一個方法中,寫了一個if判斷,寫了一個break,期望終止這個函數,編輯器出現報錯 形如下圖 視頻版問題教程: Pycharm下出現波浪線報錯,形如break outside loop 過程: 很奇…

IDEA一鍵啟動多個微服務

我們在做微服務項目開發的時候,每次剛打開IDEA,就需要把各個服務一個個依次啟動,特別是服務比較多時,逐個點擊不僅麻煩還費時。下面來說一下如何一鍵啟動多個微服務。 操作步驟 點擊Edit Configurations 2.點擊“”,…

【設計模式】JAVA Design Patterns——Facade(外觀模式)

🔍目的 為一個子系統中的一系列接口提供一個統一的接口。外觀定義了一個更高級別的接口以便子系統更容易使用。 🔍解釋 真實世界例子 一個金礦是怎么工作的?“嗯,礦工下去然后挖金子!”你說。這是你所相信的因為你在使…

性價比為王,物流商怎么選擇高效的國際物流管理平臺

在全球化貿易日益繁榮的今天,國際物流行業作為鏈接國內商家和海外市場的重要橋梁,發揮著極其重要的作用。 然而,隨著國際物流市場競爭的加劇,對物流商來說,也面臨著成本管控和效率提升的雙重挑戰。今天我們會重點探討…

解決 DataGrip 2024.1.3 連接 Tdengine 時timestamp字段顯示時區不正確問題

設置中找到該設置,將原來的設置 yyyy-MM-dd HH:mm:ss 修改為: yyyy-MM-dd HH:mm:ss.SSS z 即可。 注意:只能修改第一個,修改后提示錯誤,但是查詢數據時能成功格式化時間,修改第二個不生效,可能是 bug 具體格式見: Date…

DOS編程入門:探索基礎、深入技巧與實戰應用

DOS編程入門:探索基礎、深入技巧與實戰應用 DOS編程,作為計算機編程的基石之一,對于初學者來說,既是一種挑戰,也是一次深入了解計算機底層運作的絕佳機會。本文將從四個方面、五個方面、六個方面和七個方面&#xff0…

Opera 瀏覽器與Google聯手,推出由Gemini驅動的全新AI功能

每周跟蹤AI熱點新聞動向和震撼發展 想要探索生成式人工智能的前沿進展嗎?訂閱我們的簡報,深入解析最新的技術突破、實際應用案例和未來的趨勢。與全球數同行一同,從行業內部的深度分析和實用指南中受益。不要錯過這個機會,成為AI領…

JavaScript循環語句

JavaScript中的循環語句有三種:for循環、while循環和do...while循環。這些循環語句可以幫助我們重復執行一段代碼,直到滿足某個條件為止。 for循環: for循環是最常用的循環語句之一,它包含一個初始化表達式、一個條件表達式和一個…

富士攝像機X-H2S MOV格式化后重新寫入后的恢復方法

X-H2S是富士數碼的一款旗艦機型,支持4K/6K高清,視頻編碼為最新的HVC。下面我們來看下富士數碼攝像機恢復案例。 故障存儲:512G存儲卡 Exfat文件系統 故障現象: 512G的卡誤格式化后又進行了拍攝,卡使用了120G不到的空間,其它底…

【副業】12種程序員副業大匯總

1:寫博客。技術能力可以的寫技術文章輸出,比如當前網站、掘金、阿里云社區、騰訊云社區、其他社區。 2:賣課程。大廠高P跟知識付費平臺合作、錄課賣課程、比如極課時間、慕課網、騰訊課堂。 3:寫書。技術大拿出書,掙稿…

簡述Vue中同時發送多個請求怎么操作?

在Vue中同時發送多個請求,我們通常使用axios這個庫,因為它基于Promise,可以很好地處理異步操作。以下是兩種常用的方法來同時發送多個請求: 方法一:使用Promise.all() 定義多個請求: 使用axios.get()或axi…

【EFK日志系統】docker一鍵部署kibana、es-head

docker一鍵部署kibana、es-head kibana部署es-head部署 上一篇文章搭建了es集群 規劃服務器是 es01:172.23.165.185 es02:172.23.165.186 es03:172.23.165.187 那么kibana就搭建在主節點es01:172.23.165.185 按照順序參考: docker一鍵部署EFK系統(elas…

使用 Vue 3 和 JsBarcode 開發一維碼顯示組件

在現代前端開發中,條形碼(或稱一維碼)在許多應用場景中非常常見,例如商品管理、物流跟蹤等。本文將介紹如何使用 Vue 3 和 JsBarcode 庫來創建一個靈活的一維碼顯示組件,并展示如何在應用中使用它。 1. 安裝必要的依賴…

簡述Vue 的響應式原理中 Object.defineProperty 有什 么缺陷 ?

Vue.js 2.x 的響應式原理主要依賴于 Object.defineProperty 方法來實現數據劫持,即當數據發生變化時,能夠觸發視圖更新。然而,Object.defineProperty 方法在 Vue 的響應式系統中存在一些缺陷: 無法監聽數組的變化: Obj…

詳解生成式人工智能的開發過程

回到機器學習的“古老”時代,在您可以使用大型語言模型(LLM)作為調優模型的基礎之前,您基本上必須在所有數據上訓練每個可能的機器學習模型,以找到最佳(或最不糟糕)的擬合。 開發生成式人工智能…

【linux】線程同步和生產消費者模型

線程同步 當我們多線程訪問同一個臨界資源時,會造成并發訪問一個臨界資源,使得臨界資源數據不安全,我們引入了鎖的概念,解決了臨界資源訪問不安全的情況,對于線程而言競爭鎖的能力有強有弱,對于之前就搶到…

系統架構設計師【第9章】: 軟件可靠性基礎知識 (核心總結)

文章目錄 9.1 軟件可靠性基本概念9.1.1 軟件可靠性定義9.1.2 軟件可靠性的定量描述9.1.3 可靠性目標9.1.4 可靠性測試的意義9.1.5 廣義的可靠性測試與狹義的可靠性測試 9.2 軟件可靠性建模9.2.1 影響軟件可靠性的因素9.2.2 軟件可靠性的建模方法9.2.3 軟件的可靠性模…

實物資產的市場主線將逐步回歸

民生證券認為,投資者逐漸意識到長期趨勢并沒有發生變化,這或許正是本周最大的變化。在預期博弈重回冷靜期后,去金融化背景下實物資源占優的市場主線也將逐步回歸。 1 高低切換后的冷靜期 從4月下旬至上周,A股市場呈現出由高位資產…