淺談在Golang上面的物件導向
從物件導向的語言轉到Golang常常會遇到,不知道該怎麼在Golang實作類似多型和繼承的功能。這是因為Golang根本不是物件導向的語言。
在網路上會看到一些文章,寫說可以使用可以embed來模擬繼承,但事實上embed的用途應該只是用來減少重複的程式碼,增加可讀性。像在io package裡面就很明顯,如intreface ReadWriter就是用Reader和Writer 兩個interface組合起來的。
使用embed struct的方式來模擬繼承。為了要可以被抽換注入,還是得要同時implement一個interface。這樣還不如直接implement interface就好了。
在Golang,唯一類似物件導向的東西只有 interface。只要有implement interface,就可以在宣告使用這個interface的地方使用。
個人的理解,Golang把繼承的概念且分成兩個部分:embed和interface。embed struct (interface) 負責擴增fields (method); interface負責讓不同struct可以有相同的調用方式
embed struct 的功能只是單純消除struct的field的重用而已。embed interface 也是如此,單純想要減少 method 裡面重複宣告 method 的程式碼。
簡單來說,就是
想要可以抽換,用interface; 想要減少重複可以用embed的方式包裝組合
留言
張貼留言