C# 子类实例化基类 基类使用不了子类的方法_C#学习笔记11--接口/泛型
一.接口
1.1簡介:
接口是一種特殊的引用類型, 和類很相似. 它定義了屬性, 方法, 事件, 這些都作為接口的成員/ 接口中只包含成員的聲明, 成員的定義是派生類的責任(誰繼承誰實現).
接口在某種程度上與抽象類類似, 但是接口大多數只用在當只有少數方法由基類聲明由派生類實現時.
其實接口主要就是用來解決多繼承問題的;
1.2 接口的定義
接口使用 interface 關鍵字聲明,它與類的聲明類似, 聲明默認為 public .
interface栗子
// 定義一個陸地生物接口再次注意:方法默認就是抽象的, 所以不用加abstract關鍵字, 加了反而會報錯;
1.3 接口實例
讓 Dog 類繼承 ITerrestrial 接口
classFish 類繼承 IAquatic 接口
class執行代碼
static1.4 接口多繼承
- 派生類可以繼承多個接口, 但是對繼承過來的接口方法需要實現;
- 派生類可以同時繼承類跟接口, 但是基類只能有一個, 接口不受限制;
- 多繼承中間用逗號分隔連接;
例如 讓青蛙類繼承 ITerrestrial 接口和 IAquatic 接口
// 繼承多個接口直接用逗號隔開即可實現:
// Main 函數接口的特點:
接口和抽象類的區別(重點!!!):
相同點:
不同點:
二.泛型
我們在編寫程序時,經常遇到兩個模塊的功能非常相似(例如排序),只是一個是處理int數據,另一個是處string數據,或者其他自定義的數據類型,雖然代碼幾乎一樣,然還是得寫好遍;
這時你可能會想到用object 來解決這個問題。但是他是有缺陷的:
2.1 泛型方法
不過好在C#提供了泛型功能, 它能夠將類型作為參數來傳遞, 即在創建類型時用一個特定的符號如 " T" 作為一個占位符, 代替實際的類型, 等待在實例化時用一個實際的類型來代替.
在方法名后面加<T>, T 是類型占位符; 這個是你自己定義的, 也可以是U,E等, 但一般都是大寫字母.
2.1.1 泛型方法的定義:
1> 參數類型不確定, 返回值確定;public void ShowT<T>(T t){ 代碼段; }2> 參數類型確定, 返回值類型不確定;
public T ShowT<T>(string name){ 代碼段; }
使用情景: Unity 游戲開發中通過名字從資源文件夾中獲取對象(比如模型);
3> 參數類型和返回值類型都不確定;public T ShowT<T>(T t){ 代碼段; }// 栗子: 將參數的值打印出來
2.1.2 泛型的優點:
2.1.3 注意事項:
2.2 泛型類型參數
在泛型類型或方法定義中,類型參數是客戶端在實例化泛型類型的變量時指定的特定類型的占位符, 可以將多個類型進行泛化。
例如:
public說明:
2.3 泛型類型參數的約束
定義泛型類或泛型方法時, 可以對泛型類型進行約束限制客戶端的傳值. 如果客戶端代碼嘗試使用某個約束不允許的類型來實例化類或方法, 則會產生編譯錯誤. 這些限制成為約束.
2.3 泛型類
泛型類封裝不特定數據類型的操作. 通常, 創建泛型類是從現有具體類開始, 然后每次逐個將類型更改為類型參數.
練習1: 將任意類型的數組拼接成字符串
// 定義一個泛化方法練習2 : 將任意類型的數組進行冒泡排序(考慮 對類和結構體排序)
// 定義一個Person類, 繼承 IComparable接口是因為類本身是不能進行比較的, 但是繼承該接口就可以重寫接口中的CompareTo方法;自己定義比較運算同理 結構體類型和類非常類似
// 定義 Student 結構體繼承IComparable 接口泛型的冒泡排序:
// 這里注意 泛型類型的參數是不能進行運算符的運算的, 要通過CompareTo方法來實現, 所以就要規定一下T要遵循IComparable接口=======================================================
思維導圖:
總結
以上是生活随笔為你收集整理的C# 子类实例化基类 基类使用不了子类的方法_C#学习笔记11--接口/泛型的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java葵花宝典_JAVA程序员想入职跳
- 下一篇: echarts怎么控制一个点沿着折线移动