【C#補全計劃:類和對象(九)】接口

一、接口的概念

1. 概念:接口是行為的抽象規范,也是一種自定義類型

2. 接口聲明規范:

? ? ? ? (1)不包含成員變量

? ? ? ? (2)只包含屬性、方法、索引器、事件

? ? ? ? (3)成員不能被實現

? ? ? ? (4)成員可以不寫訪問修飾符(默認public),不能是私有的

? ? ? ? (5)接口不能繼承類,但是可以繼承另一個接口

3. 接口使用規范

? ? ? ? (1)類可以繼承多個接口

? ? ? ? (2)類繼承接口后,必須實現接口中所有成員

4. 特點:

? ? ? ? (1)接口的聲明和類的聲明類似

? ? ? ? (2)接口是用來繼承的

? ? ? ? (3)接口不能被實例化,但是可以作為容器存儲對象

二、接口的聲明

1. 關鍵字:interface

2. 語法:

interface 接口名

{

}

3. 作用:接口是抽象行為的“基類”

4. 命名規范:I + 帕斯卡命名

using System;namespace Interface
{interface IFly // 聲明接口{int Height { // 成員屬性不能被實現get; set;}int this[int index] { // 成員索引器不能被實現get; set;}void fly(); // 成員方法不能被實現}
}

三、接口的使用

1.?類可以繼承一個父類,n個接口

2.?類繼承接口后,必須實現接口中的所有內容,并且必須是public的

using System;namespace Interface
{interface IFly // 聲明接口{int Height { // 成員屬性不能被實現get; set;}int this[int index] { // 成員索引器不能被實現get; set;}void fly(); // 成員方法不能被實現}class Animal // 基類{string Name {get; set;}}// 類可以繼承一個父類,n個接口// 類繼承接口后,必須實現接口中的所有內容,并且必須是public的class Bird : Animal, IFly // 繼承父類和接口{public int Height { // 實現接口屬性get; set;}public int this[int index] { // 實現接口索引器get { return index; }set { }}public void fly() // 實現接口方法{Console.WriteLine("鳥用翅膀飛了" + Height + "米");}}
}

3.?實現的接口函數,可以加virtual再在子類重寫

using System;namespace Interface
{interface IFly // 聲明接口{int Height { // 成員屬性不能被實現get; set;}int this[int index] { // 成員索引器不能被實現get; set;}void fly(); // 成員方法不能被實現}class Animal // 基類{string Name {get; set;}}// 類可以繼承一個父類,n個接口// 類繼承接口后,必須實現接口中的所有內容,并且必須是public的class Bird : Animal, IFly // 繼承父類和接口{public int Height { // 實現接口屬性get; set;}public int this[int index] { // 實現接口索引器get { return index; }set { }}// 實現的接口函數,可以加virtual再在子類重寫public virtual void fly() // 實現接口方法{Console.WriteLine("鳥用翅膀飛了" + Height + "米");}}
}

4. 接口也遵循里氏替換原則

using System;namespace Interface
{interface IFly // 聲明接口{int Height { // 成員屬性不能被實現get; set;}int this[int index] { // 成員索引器不能被實現get; set;}void fly(); // 成員方法不能被實現}class Animal // 基類{string Name {get; set;}}// 類可以繼承一個父類,n個接口// 類繼承接口后,必須實現接口中的所有內容,并且必須是public的class Bird : Animal, IFly // 繼承父類和接口{public int Height { // 實現接口屬性get; set;}public int this[int index] { // 實現接口索引器get { return index; }set { }}// 實現的接口函數,可以加virtual再在子類重寫public virtual void fly() // 實現接口方法{Console.WriteLine("鳥用翅膀飛了" + Height + "米");}}class Program{static void Main(string[] args){// 接口也遵頊里氏替換原則IFly f = new Bird();}}
}

5. 接口可以繼承接口

using System;namespace Interface
{interface IFly // 聲明接口{int Height { // 成員屬性不能被實現get; set;}int this[int index] { // 成員索引器不能被實現get; set;}void fly(); // 成員方法不能被實現}interface IWalk // 聲明第二個接口{void walk();}interface IMove : IFly, IWalk // 接口繼承接口{void move(string value);}class Animal // 基類{string Name {get; set;}}// 類可以繼承一個父類,n個接口// 類繼承接口后,必須實現接口中的所有內容,并且必須是public的class Bird : Animal, IFly // 繼承父類和接口{public int Height { // 實現接口屬性get; set;}public int this[int index] { // 實現接口索引器get { return index; }set { }}// 實現的接口函數,可以加virtual再在子類重寫public virtual void fly() // 實現接口方法{Console.WriteLine("鳥用翅膀飛了" + Height + "米");}}class Person : IMove{public int Height { // 實現接口屬性get; set;}public int this[int index] { // 實現接口索引器get {return index;}set {}}public virtual void fly() // 實現接口方法{Console.WriteLine("人乘坐飛機飛了" + Height + "米");}public void walk() // 實現接口方法{Console.WriteLine("人用腿行走");}public void move(string value) // 實現接口方法{if(value == "fly") {fly();} else if(value == "walk") {walk();}}}class Program{static void Main(string[] args){// 接口也遵頊里氏替換原則IFly f = new Bird();// 都遵循里氏替換原則IMove move = new Person();IFly fly = new Person();IWalk walk = new Person();}}
}

四、顯式實現接口

1. 作用:當一個類繼承多個接口,而接口中存在同名方法時,使用顯式實現接口

2. 語法:接口名.函數名() {}

3. 代碼:

using System;namespace Interface
{interface IFly // 聲明接口{int Height { // 成員屬性不能被實現get; set;}int this[int index] { // 成員索引器不能被實現get; set;}void fly(); // 成員方法不能被實現}interface IWalk // 聲明第二個接口{void walk();}interface IMove : IFly, IWalk // 接口繼承接口{void move(string value);}class Animal // 基類{string Name {get; set;}}// 類可以繼承一個父類,n個接口// 類繼承接口后,必須實現接口中的所有內容,并且必須是public的class Bird : Animal, IFly // 繼承父類和接口{public int Height { // 實現接口屬性get; set;}public int this[int index] { // 實現接口索引器get { return index; }set { }}// 實現的接口函數,可以加virtual再在子類重寫public virtual void fly() // 實現接口方法{Console.WriteLine("鳥用翅膀飛了" + Height + "米");}}class Person : IMove{public int Height { // 實現接口屬性get; set;}public int this[int index] { // 實現接口索引器get {return index;}set {}}public virtual void fly() // 實現接口方法{Console.WriteLine("人乘坐飛機飛了" + Height + "米");}public void walk() // 實現接口方法{Console.WriteLine("人用腿行走");}public void move(string value) // 實現接口方法{if(value == "fly") {fly();} else if(value == "walk") {walk();}}}/*----------------------------------------------------------*/// 顯式實現接口interface IAtk{void atk();}interface ISkill{void atk();}class Player : IAtk, ISkill // 實現多個接口{void IATK.atk() // 顯式實現接口方法{Console.WriteLine("玩家普通攻擊");}void ISkill.atk() // 顯式實現接口方法{Console.WriteLine("玩家釋放技能攻擊");}}class Program{static void Main(string[] args){// 接口也遵頊里氏替換原則IFly f = new Bird();// 都遵循里氏替換原則IMove move = new Person();IFly fly = new Person();IWalk walk = new Person();}}
}

4. 注意:

? ? ? ? 若使用子類容器,則無法調用顯式實現接口的方法,需要轉換尾父類容器。

using System;namespace Interface
{interface IFly // 聲明接口{int Height { // 成員屬性不能被實現get; set;}int this[int index] { // 成員索引器不能被實現get; set;}void fly(); // 成員方法不能被實現}interface IWalk // 聲明第二個接口{void walk();}interface IMove : IFly, IWalk // 接口繼承接口{void move(string value);}class Animal // 基類{string Name {get; set;}}// 類可以繼承一個父類,n個接口// 類繼承接口后,必須實現接口中的所有內容,并且必須是public的class Bird : Animal, IFly // 繼承父類和接口{public int Height { // 實現接口屬性get; set;}public int this[int index] { // 實現接口索引器get { return index; }set { }}// 實現的接口函數,可以加virtual再在子類重寫public virtual void fly() // 實現接口方法{Console.WriteLine("鳥用翅膀飛了" + Height + "米");}}class Person : IMove{public int Height { // 實現接口屬性get; set;}public int this[int index] { // 實現接口索引器get {return index;}set {}}public virtual void fly() // 實現接口方法{Console.WriteLine("人乘坐飛機飛了" + Height + "米");}public void walk() // 實現接口方法{Console.WriteLine("人用腿行走");}public void move(string value) // 實現接口方法{if(value == "fly") {fly();} else if(value == "walk") {walk();}}}/*----------------------------------------------------------*/// 顯式實現接口interface IAtk{void atk();}interface ISkill{void atk();}class Player : IAtk, ISkill // 實現多個接口{void IAtk.atk() // 顯式實現接口方法{Console.WriteLine("玩家普通攻擊");}void ISkill.atk() // 顯式實現接口方法{Console.WriteLine("玩家釋放技能攻擊");}}class Program{static void Main(string[] args){// 接口也遵頊里氏替換原則IFly f = new Bird();// 都遵循里氏替換原則IMove move = new Person();IFly fly = new Person();IWalk walk = new Person();Player player = new Player();// person.atk(); // 調用接口方法, 編譯報錯Console.WriteLine("轉換為IATK類:");(player as IAtk)?.atk(); // 顯式實現接口方法,調用時需要轉換類型Console.WriteLine("轉換為ISkill類:");(player as ISkill)?.atk(); // 顯式實現接口方法,調用時需要轉換類型}}
}

????????至此,面向對象的三大特性之一:多態就學習完了。

? ? ? ? 今天的學習就到這里了,感謝閱讀。

? ? ? ? 再見!

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

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

相關文章

SRS簡介及簡單demo

SRS介紹 SRS(Simple Realtimes Server)是一款開源的實時流媒體服務器,專注于解決直播、實時互動等場景的流媒體傳輸問題。SRS 的設計目標是 “簡單、穩定、高效”,專門針對實時流媒體協議(如 RTMP、HLS、HTTP-FLV、WebRTC 等)進行優化,專注于解決 “低延遲、高并發” 的…

python基礎:數據解析BeatuifulSoup,不需要考慮前端形式的一種獲取元素的方法

1.beatuifulSoup 基本用法 beautifulSoup(簡稱bs4)是python的一個第三方庫,用于解析html和xml文檔中提取數據的python庫。它能夠將復雜的文檔轉化為樹形結構,方便快速定位和提取所需數據以及查找和修改,常常與爬蟲框架…

Ubuntu共享文件夾權限設置

在Ubuntu中設置共享文件夾的權限(只讀、讀寫、無權限),主要通過兩種方式實現:?文件系統權限?和?Samba共享配置?。以下是詳細步驟:?一、文件系統權限設置(基礎權限)?1. ?修改文件夾所有權…

小程序點擊菜單欄實現樣式動態切換

小程序點擊菜單欄背景樣式動態切換 前言:今天做一個小程序項目,要做一個菜單欄動態切換的功能,因為這種需求很常見,這次干脆記錄一下,幫助別人的同時,自己下次也可以直接照搬使用。 效果截圖如下&#xff1…

掌握工程化固件燒錄,開啟你的技術進階之路-FPGA ISE(xilinx)

1、電腦需先行安裝ISE14.7。若已完成安裝,此步驟可略過;若尚未安裝,在后續章節會介紹如何安裝ISE,由于ISE14.7的安裝程序體量龐大,可借助U盤進行傳輸。同時,電腦需預留至少30G的存儲空間以用于安裝該程序。…

Android 之 面試八股文

?1.Activity生命周期????問題??:描述Activity從啟動到銷毀的完整生命周期方法,并說明onSaveInstanceState()的調用時機。??參考答案??:onCreate()→ onStart()→ onResume()(活躍狀態) → onPause()&#x…

暴力解決MySQL連接失敗

本文涉及清空root密碼完全重置MySQL權限徹底卸載并重裝MySQL請務必在測試/本地環境操作,生產環境慎用!場景Spring Boot項目連接MySQL一直報Access denied for user rootlocalhost,改密碼、換驅動都沒用?步驟1:完全重置…

前端開發:CSS(1)—— 什么是CSS?

本文用于記錄前端開發的學習過程。前面我們已經學習了html的編寫,知道了Web開發的一些最基本的知識;在html的學習過程中,我們提到關于樣式的設計和修改常需要使用CSS來實現。那么CSS到底是什么東西呢?它又如何來設計樣式呢&#x…

數據結構(4)—棧和隊列

一、概念1.棧只允許在棧頂位置入棧和出棧元素,鏈表可以在任意位置插入和刪除元素,棧和隊列只允許在指定位置插入和刪除元素2.鏈表、棧和隊列都是一種線性結構(一對一),棧和隊列是一種特殊的表狀結構二、棧1.基礎概念先…

vue2.如何給一個頁面設置動態的name。不同路由使用一樣的組件。頁面不刷新怎么辦?

page里面detail.vue export default { name: detail, } vue2里面.vue的頁面都會設置一個name,這個通常是寫死的。不能在頁面動態設置的。頁面刷新緩存通常都是根據這個name來判斷的。如果name寫死。我幾個頁面都通用這一個頁面的話,他也不刷新頁面啊。 比…

浮動IP(Floating IP)的刪除通常需要滿足什么條件

浮動IP(Floating IP)的刪除通常需要滿足什么條件在云計算或網絡環境中,浮動IP(Floating IP)的刪除通常需要滿足一定的條件,以確保操作不會影響現有業務或導致網絡中斷。以下是常見的可刪除浮動IP的場景和條…

機器學習之隨機森林(Random Forest)實戰案例

一、算法基礎 首先,來介紹一下算法的基礎語法 class sklearn.ensemble.RandomForestClassifier(\ n_estimators’warn’,\ criterion’gini’,\max_depthNone, \ min_samples_split2,\ min_samples_leaf1, \ min_weight_fraction_leaf0.0, \ max_features’auto’…

《C語言》指針練習題--1

《C語言》指針練習題–1 1. 交換兩個整數的值 題目描述: 編寫一個C程序,定義一個函數swap,使用指針參數交換兩個整數的值。在main函數中調用該函數并輸出交換后的結果。 解題思路: 為了交換兩個整數的值,可以通過指針傳…

應急響應整理

目錄 windows下 1. 檢查賬號安全 利用注冊表實現用戶隱藏 粘滯鍵后門 2 檢查異常端口、進程 3. 檢查啟動項、計劃任務、服務 4. 日志分析-Windows 常見事件類型、登錄類型 Linux下 1. 賬號安全 2. 歷史命令 3. 檢查異常端口 4. 檢查異常進程 5. 檢查開機啟動項 …

一文讀懂 C# 中的 Bitmap

一文讀懂 C# 中的 Bitmap 一、Bitmap 到底是什么? 二、推薦使用場景 三、實戰 Demo 基礎用法:加載、創建和保存 進階用法 縮放圖片 裁剪圖片 顏色調整(反色處理) 四、核心方法和屬性說明 常用函數 常用屬性 五、避坑指南、注意事項 六、總結與決策 一文讀懂 C# 中的 Bitmap…

預約時間組件

效果圖如何使用<template><view><button click"pickerTime(0)">預約時間0</button><button click"pickerTime(1)">預約時間1</button><button click"pickerTime(2)">預約時間2</button><but…

Android 開發 - Service、Camera、Layout Design 自定義設備類型和大小

一、Service 啟動 1、基本介紹 &#xff08;1&#xff09;startService()其他組件通過調用 startService() 啟動 Service 后&#xff0c;Service 可在后臺無限期運行&#xff0c;即使啟動 Service 的組件被銷毀也不受影響&#xff0c;一般情況下 startService() 是執行單一操作…

Qwen Image:開源中文渲染SOTA,重塑文生圖技術邊界

1. Qwen Image的技術定位與行業痛點1.1 文本渲染&#xff1a;文生圖領域的長期技術瓶頸傳統文生圖模型在圖像美學與真實感優化上已取得顯著進展&#xff0c;但多語言文本渲染始終是行業難以突破的瓶頸。主流模型在處理中文等非字母語言時&#xff0c;常出現字符斷裂、布局錯位、…

Docker入門教程:在騰訊云輕量服務器上部署你的第一個容器化應用 (2025)

更多云服務器知識&#xff0c;盡在hostol.com“在我電腦上明明是好的啊&#xff01;”這句話&#xff0c;是不是堪稱程序員“甩鍋”排行榜第一名的金句&#xff1f;當你辛辛苦苦開發完一個應用&#xff0c;把它交給同事或者部署到服務器上時&#xff0c;卻發現因為它依賴的某個…

DevOps平臺結合Gradle實現打包流水線

在現代軟件開發中,持續集成與持續交付(CI/CD)已成為團隊提速、降本增效的核心實踐。Gradle作為強大的自動化構建工具,常被用于Android與Java項目的構建打包任務。而將Gradle集成進企業的DevOps平臺中,不僅可以標準化構建過程,還能自動化打包、測試、發布的全流程,大幅提…