主題

【Unity C# 學習筆記】了解一下interface用處

趴趴鼠Loading | 2021-01-09 23:12:08

前言:
因為課本安排,當初interface(介面) 和 class (類別) 是一起學的,當下覺得既然有抽象類別的存在,介面到底可以幹嘛?
介面的限制有:
  • 只可包含 方法、屬性、索引子、事件的宣告 (來源),變數不能直接宣告,要使用get、set方法。
  • 不可以包含實作。
  • 繼承的類別必須實作介面宣告的東西。
這就奇怪了,給人宣告又不准實作。一直想不透介面實用的地方,所以好長一段時間我都只用抽象類別。 最近開始接觸IEnumerable、IEnumerator... 加上最近學A*尋路剛好用上介面的概念,今天就順勢整理一下。


介面
在這個影片中,作者為了優化而自製heap類別,讓節點在加入的同時做排序。

《計算的時間複雜度(最差、平均、和最好表現),依據串列(list)的大小(n)。一般而言,好的表現是O(n log n),壞的表現是O(n^2)。對於一個排序理想的表現是O(n) 》

來源:heap sortwiki

以下是學習試著照概念做一個類型:
程式碼:

輸出:

「MyPrintableList」是個模擬array的自訂類別,有add、count和pop等基本操作。

第8、9行:
被註解掉是因為第26行的 「where」(參考微軟文件),簡單說是限定T必須是什麼型態才能繼承:
where T : struct // T must be a struct
where T : new()  // T must have a default parameterless constructor
where T : IComparable // T must implement the IComparable interface
(來源)


測試2: 介面繼承介面
如果還是不懂介面的用途的話,下面這段程式,我有SortVerseData與SortOrderData類別,唯一的差別是兩者CompareTo結果是相反的。

輸出:

根據這個討論,介面繼承介面滿常見的。

心得:
介面到底有什麼用途? 比起課本「賽車是車,車有run()的方法」這種跟抽象類別模玲兩可的說法,介面給我的感覺更像是讓處理這類資料的類別有個共識,知道繼承這些介面的資料有什麼內容、方法;例如繼承了IComparable介面的類型,可以訂定自己的CompareTo規則,不管是要先乘再減還是怎樣,其他腳本在使用時只需簡單的呼叫方法,哪怕某天多了個參數要一起Compare,也只需改寫該類型的CompareTo方法,而不是找遍整個專案去修改if()判斷式。






生活雜記:
一直被叫重作demo,說先把這個模式做出來看好不好玩再改。哭了,每次改不同模式程式碼都要重寫啊。現在只知道理念跟想要使用的主角模組,但究竟有哪些動作跟玩法我也不清楚,然後說這種作業流程在業界很常見,....((現在好像知道企畫書的重要性了...

感覺....好累.....
往往一般人覺得簡單的地方其實都是最難做的。
216 巴幣: 34
Yuze 湯瀨
拍拍... 這樣下去容易沒完沒了,看來只能去請神通靈了。
2021-01-10 00:50:54
趴趴鼠Loading
感謝鼓勵[e3] 因為對方是大佬我也不太敢講甚麼
2021-01-11 00:58:50
御安鴨鴨
我看不懂QQ
2021-01-10 12:06:19
趴趴鼠Loading
沒關係啦~就是些介面的學習筆記,重點是影片裡,原本用list的資料改用heap sort,執行時間從28ms降到平均5ms的神奇魔法
2021-01-11 01:00:20
教授加博士先生
A*例子好像不太好講抱歉,不知道這樣會不會比較清楚XD https://pastebin.pl/view/4edbfdd8 不過這個也是我隨便簡單寫的超簡化版, 如果真要搞抽象,可以搞非常抽象,應該還要去考慮IEdge? 然後每個Vertex可能也要抽象成T type, 不一定要int
2021-01-11 01:38:58
教授加博士先生
如果有機會(?)學C++ 的STL(標準模板庫),就可以看到C++ STL完全就是100%這樣設計的,算法和容器(內部資料結構)完全是分離的。
2021-01-11 01:43:01
教授加博士先生
當然通常這樣搞非常累也非常難==通常遊戲開發是先幹再說啦...要寫一個抽象通用的算法庫難度還是挺高的。。。像是interface的各種設計,interface之間的繼承。IDirectedGraph可能又繼承更抽象的IGraph, blablabla....
2021-01-11 01:44:53

更多創作