GO言語でのカプセル化、継承、およびマルチステート

4518 ワード

パッヶージ
goのパッケージはjavaとは異なり、goの中にはjavaの中のclassはありませんが、structをクラスと見なすことができ、パッケージは簡単にstructのパッケージと見なすことができます.以下のようにします.
type obj1 struct {
    valte1 string
}
type obj2 struct {
    valte2 string
}

継承
structをクラスと見なし、structには他のstructを含め、内部structを継承する方法と変数を含むことができ、同時に書き換えることができ、コードは以下の通りである.
package main

import "fmt"

type oo struct {
    inner
    ss1 string
    ss2 int
    ss3 bool
}

type inner struct {
    ss4 string
}

func (i *inner) testMethod(){
    fmt.Println("testMethod is called!!!")
}

func main()  {
    oo1 := new(oo)
    fmt.Println("ss4  :"+oo1.ss4)
    oo1.ss4 = "abc"
    fmt.Println("ss4   "+oo1.ss4)
    oo1.testMethod()//    
    oo1.inner.testMethod()//            
}

マルチステート
goの複数台はjavaのよりずっと隠れており,厳密には多態ではないが,インタフェースを用いて行うことができ,いずれも同じインタフェースを実現した2つのオブジェクトに対して類似したアップシフトを行うことができ,このとき方法を多態ルーティングして配布することができ,完全コードは以下の通りである.
package main

import "fmt"

type interfacetest interface {
    //testMothod1() string
    //testMothod()//          go       
    iMethod() //  int       go         , java   
}

type obj1 struct {
    valte1 string
}

type obj2 struct {
    valte2 string
}

//       testMothod           
func ( obj11 *obj1)iMethod(){
    fmt.Println("testMothod go obj1")
}

//       testMothod           
func ( obj11 *obj2)iMethod() {
    fmt.Println("testMothod go obj2")
}


func gorun(ii interfacetest){
    fmt.Println(ii.iMethod)
}

func main(){
    var i interfacetest
    //interfacetest_ := new(interfacetest)//                GO       var i interfacetest
    obj1_ := new(obj1)
    // obj1
    i = obj1_
    i.iMethod()//    
    gorun(i)
    gorun(obj1_)
    //interfacetest_.testMethod() //   java   , go      
    // obj2
    obj2_ := new(obj2)
    i = obj2_
    i.iMethod()//    
    gorun(i)
    gorun(obj2_)
    list := [2]interfacetest{obj1_,obj2_}

    slice := []interfacetest{}
    slice = append(slice, obj1_)
    slice = append(slice, obj2_)
    for index,value := range slice {
        fmt.Println(index)
        fmt.Println(value)
    }
    fmt.Println(len(slice))

    fmt.Println(len(list))
}