因為課本安排,當初interface(介面) 和 class (類別) 是一起學的,當下覺得既然有抽象類別的存在,介面到底可以幹嘛?介面的限制有:
這就奇怪了,給人宣告又不準實作。一直想不透介面實用的地方,所以好長一段時間我都只用抽象類別。 最近開始接觸IEnumerable、IEnumerator... 加上最近學A*尋路剛好用上介面的概念,今天就順勢整理一下。
- 只可包含 方法、屬性、索引子、事件的宣告 (來源),變數不能直接宣告,要使用get、set方法。
- 不可以包含實作。
- 繼承的類別必須實作介面宣告的東西。
介面
在這個影片中,作者為了優化而自製heap類別,讓節點在加入的同時做排序。
《計算的時間複雜度(最差、平均、和最好表現),依據串列(list)的大小(n)。一般而言,好的表現是O(n log n),壞的表現是O(n^2)。對於一個排序理想的表現是O(n) 》
來源:heap sort、wiki
以下是學習試著照概念做一個類型:
程式碼:
輸出:
「MyPrintableList」是個模擬array的自訂類別,有add、count和pop等基本操作。
第8、9行:
被註解掉是因為第26行的 「where」(參考微軟文件),簡單說是限定T必須是什麼型態才能繼承:where T : struct // T must be a structwhere T : new() // T must have a default parameterless constructorwhere T : IComparable // T must implement the IComparable interface(來源)
如果還是不懂介面的用途的話,下面這段程式,我有SortVerseData與SortOrderData類別,唯一的差別是兩者CompareTo結果是相反的。
輸出:
根據這個討論,介面繼承介面滿常見的。
心得:
介面到底有什麼用途? 比起課本「賽車是車,車有run()的方法」這種跟抽象類別模玲兩可的說法,介面給我的感覺更像是讓處理這類資料的類別有個共識,知道繼承這些介面的資料有什麼內容、方法;例如繼承了IComparable介面的類型,可以訂定自己的CompareTo規則,不管是要先乘再減還是怎樣,其他腳本在使用時只需簡單的呼叫方法,哪怕某天多了個參數要一起Compare,也只需改寫該類型的CompareTo方法,而不是找遍整個專案去修改if()判斷式。
生活雜記:
一直被叫重作demo,說先把這個模式做出來看好不好玩再改。哭了,每次改不同模式程式碼都要重寫啊。現在只知道理念跟想要使用的主角模組,但究竟有哪些動作跟玩法我也不清楚,然後說這種作業流程在業界很常見,....((現在好像知道企畫書的重要性了...
感覺....好累.....
往往一般人覺得簡單的地方其實都是最難做的。