7Dec/09Off
goで継承は出来ない…けど
んー、確かに「継承」はできないんだけど。似たような別の方法はあるってことで。
golangのLanguage Design FAQ::「Why is there no type inheritance?」辺りを読むといいかも。
method setを無名で内包する形で定義すると継承したみたいな感じになるっていうのと、interfaceは使いたい放題っていう当たりがキモかなぁ。
継承というよりは拡張という感じだけど感じ方はひとそれぞれ。
以下、サンプル。
package main
import ( "fmt";)
type Pointer2D interface {
SetPoint( X int, Y int );
}
type Point2D struct {
X, Y int;
}
type Point3D struct {
Point2D;
z int;
}
func (p *Point2D)SetPoint( X int, Y int){
p.X = X;
p.Y = Y;
fmt.Printf("%v,%v
", p.X, p.Y );
}
func (p *Point3D)SetPoint( X int, Y int, Z int){
p.Point2D.SetPoint( X, Y );
p.z = Z;
fmt.Printf("%v,%v,%v
", p.X, p.Y, p.z );
}
func main(){
var p2 Point2D;
var p3 Point3D;
p3.SetPoint( 1, 2, 3 );
p3.Point2D.SetPoint( 4, 5 );
// goではオーバーロード出来ないのでこう書く
p2 = p3.Point2D; // アップキャストみたいなもん
p2.SetPoint( 6, 7 );
var p2i Pointer2D;
p2i = &p2;
// インターフェイスには同メソッドさえあれば参照を代入できる
p2i.SetPoint( 8, 9 );
fmt.Printf("%v, %v
", p2, p3 );
}