2017-11-24 21 views
-1

このコードを見てください。ポインタでインターフェイスを実装する

type moninterface2 interface { 
    methode_commune(a,b int) int 
} 

type classe1 struct { 
    a, b int 
} 

type classe2 struct { 
    c, d int 
} 

func (r classe1) methode_commune(a,b int) int { 
    return a+b 
} 

func (r classe2) methode_commune(a,b int) int { 
    return a*b 
} 

func fonctiontest(param moninterface2) { 
    ret := param.methode_commune(2,3) 
    fmt.Println(ret) 
} 

をしかし、私はこのようmethode_communeを宣言した場合::すべてが正常に動作します

func (r *classe1) methode_commune(a,b int) int 
func (r *classe2) methode_commune(a,b int) int 

Goがclasse1を考慮しないとclasse2moninterface2実装し、コードがコンパイルされません。私はなぜなのか理解していない。

+0

受け取ったコンパイルエラーは何ですか?それはおそらくあなたに理由を教えてくれるでしょう。 – Flimzy

+0

それは私のためにコンパイルします。詳細を教えていただけますか? https://play.golang.org/p/hUCFWu5tl1 –

+0

単なる値の代わりにポインタを渡してください。例えば。 'fonctiontest(&classe1 {})'は正常です、 'fonctiontest(classe1 {})'は** not ** okです。 – mkopriva

答えて

1

Goでは、コードがコンパイルされないclasse1classe2実装moninterface2と を考慮していません。私はなぜなのか理解していない。あなたはこれに作業コードを変更するため、後

func (r *classe1) methode_commune(a,b int) int 
func (r *classe2) methode_commune(a,b int) int 

2種類、classe1classe2moninterface2インターフェイスを実装*classe2 2種類*classe1代わりに、もうインターフェイスを実装していません。

T*Tは同じではありません。

したがって、あなたがmoninterface2インタフェースが期待されているwhereeverclasse1またはclasse2ポインタを渡す必要があります、コードのコンパイルを行います。例えば。 fonctiontest(&classe1{})

関連する問題