Goのオブジェクト指向についての調査
Java,C++でのオブジェクト指向で実現される機能がどのようにGoで実現されるか
調査、考察してみました。
大規模開発をするにはこの辺重要なので、しっかり調べたいところです。
●ポリモフィズム
Javaでは、クラスを継承することで、呼び出しインターフェースを共有していましたが、
Goでは共有するインターフェース(関数)をあらかじめ宣言してしまいます。
このインターフェースを使うには型(type)を作成し、
その型をレシーバーとして持つ関数を作ります。
前回公開したやつです。内容は洗練されてませんが概要はわかるかと…
//ファイル扱うためのインターフェース type BaseFile interface { Write(file ,data string); GetData(str string) string; GetFileName() string; } //おもむろにタイプを作ります。 type TXTFile struct{ } // (TXTFile)がレシーバーというものだそうでどのタイプに属するかを意味します。 func (TXTFile) Write(file,data string) { templateWrite(file,data) } //(TXTFile)がレシーバー,(str string)が引数、stringが戻り値 func (TXTFile) GetData(str string) string { return str; } func (TXTFile) GetFileName() string { return "Temp.txt"; }
インターフェースはインターフェースとして記載するということです。
この方法により、実装の継承と、インターフェースの継承を分けることが出来、
また、インターフェースに対してプログラム手法がより一般的になったといえるでしょう。
いま思い浮かんだ疑問、複数レシーバーとか持ったりできるのかな?
●継承(実装の)
以下のやつ読んでみると、構造体をネストすることで実装を継承できるようです。
公式から配布のpdf
以下抜粋です。
type A struct { ax, ay int } type B struct { A; bx, by float; } b := B{ A{ 1, 2 }, 3.0, 4.0 }; fmt.Println(b.ax, b.ay, b.bx, b.by); Prints 1 2 3 4
インターフェースの中にインターフェース持ったりもできるそうです。
継承はできるのですが、typeとinterfaceを活用し、コンポジション(委譲)的なものを
メインにしたほうがいいんじゃないかなーと、現在思案中です。
●カプセル化
パッケージ単位で実現され、大文字で始まる文字はパブリック、
小文字で始まる文字はプライベートになるようです。
以下またpdfからの抜粋です。
Private type and fields: type point struct { x, y float } Exported type and fields: type Point struct { X, Y float }
今までのパッケージは名前の分けるために使われていましたが、
Goでは機能ごとにパッケージにして、処理を分ける意味がより明確になっていますね。
Javaと比較すると、インターフェースは素晴らしく進化し、
継承機能はコンポジションが強化されたことを考えると進化していますし、
カプセル化については、まだ評価しきれていないですが、パッケージごとにまとめる思想が進むのはよいことかもしれません。