iT邦幫忙

2021 iThome 鐵人賽

DAY 17
0
Software Development

溫柔學姐的Kotlin補課/教學系列 第 17

學校的白色咖啡屋(一):繼承的根基與擴展的自由 Inheritance Implement Any

為了加強記憶,詩憶總會整理前一晚的筆記。

「可是,要怎麼確保每個類別都有toString()函式呢?」窗上映著女孩百思不解的臉。「之前學姐寫的自定義類別也沒看到這個函式呀。」

筆電在詩憶的操作下跑了一個簡單的程式。

fun main() {
    println(Empty())
}
class Empty

「嗯⋯⋯就連空的class都有toString(),雖然出來的是詭異的結果Empty@5b2133b1,我記得學姐說小老鼠符號後是物件存放的記憶體位置。那我用昨天學的函式搜尋法,看看空的class有哪些函式。」

結果浮出了三個方法,equals()hashCode()toString()
其中hashCode()印出的值是1528902577

「我的第六感和我說toString()的值和hashCode()的值有關係。啊,5b2133b1的十六進位轉換成十進位不就是1528902577嗎!」

她找到了答案,非常開心。等不及到晚上的授課時間就聯絡了唯心,相約在學校的白色咖啡屋見面。

一見到唯心之後,詩憶就迫不急待的分享她的發現。

「對唷,所有的類別都繼承了Any類別,這三個方法就是Any類別提供的,反過來說,Any類別就是所有類別的先祖superclass。」唯心看著女孩因自己肯定的話語露出更加開心的笑容,嘴角也浮出淺淺的笑意。「這些繼承來的函式是可以覆寫的,如果已經被覆寫還想呼叫先祖的函式內容,就用super.開頭,和superclass這個名字呼應著,很好記唷。」

「所有函式都可以覆寫嗎?」詩憶問。

「可繼承的類別只有兩種,open classabstract class,前者和一般的類別沒有差別,只需要在開放覆寫的函式也加上open,後者的函式則是加上abstract。還有一個不是類別但可以覆寫的存在——介面interface,裡面的函式什麼都不用加就可以開放覆寫。」唯心想了想又誠實的加上一句。「他們三者的用途差異很多人都難以分清呢。」

「⋯⋯」詩憶覺得自己就是其中一員。

看著女孩呆呆傻傻的樣子,唯心噗哧一笑,忍不住捏了捏她的臉。「妳還有我呢。」

interface最常被使用的原因是,相對於一個類別一次只能選擇一個可繼承類別作為根基繼承,interface卻可以同時擴展好幾個,自由度高。而open classabstract class的分別主要在於後者不能實體化,只負責讓其他類別繼承。而拿實際的東西來舉例的話——」就在她煩惱哪個例子比較好說明時,一隻優雅的貓咪跳進她的懷裡。

「學姐我想摸摸貓咪。」詩憶說著就小心地挪動步子靠過去。

貓咪趴在唯心的膝蓋上,懶洋洋地看了一眼詩憶,沒有避開她的手。

等詩憶滿足的回到她的座位後,唯心才繼續剛剛的話題。「以手機為例,abstract class是主機板,要等外殼和其他零件裝上後才能出售;open class是已經可以出售的手機,但提供客製化容量的選擇;interface是各種配件,如耳機一般能搭配手機也能搭配電腦,但單獨存在時沒有辦法使用。」


上一篇
尋找字串與她的小夥伴:正規式 String Regex Replace
下一篇
學校的白色咖啡屋(二):效率的勝利 Collections And Sequences
系列文
溫柔學姐的Kotlin補課/教學31
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言