2017-08-15 9 views
-1

私は関数の引数でインタフェースに問題があります。関数のインターフェイスをどのように使用しますか?ここで、引数は別のインターフェイスで、同じ関数リストを持っていますか?

package main 

import (
    "fmt" 
) 

type A interface { 
    New() A 
    B() 
    C() 
} 

type B interface { 
    New() B 
    B() 
} 

type AS struct {} 
func (AS) New() A { 
    return AS{} 
} 

func (AS) B() {} 
func (AS) C() {} 

func Hello(b B) { 
    b.New() 
} 

func main() { 
    fmt.Println("Hello, playground") 

    as := AS{} 
    a := A(as) 
    Hello(a) 
} 

私はこのエラーを持っている:

tmp/sandbox293137995/main.go:35: cannot use a (type A) as type B in argument to Hello: 
A does not implement B (wrong type for New method) 
    have New() A 
    want New() B 

Playground

私は機能のHelloでインタフェースAを使用したい場合、私は、このコードをリファクタリングすることができますどのように? ありがとう!

+1

インタフェース上で 'New()'メソッドを使用する目的は何ですか?それはまったく意味をなさないわけではありません、そして、それはあなたのエラーが原因です。 – Gavin

+2

Goに古典的なOOPを再現しようとしないでください。あなたは自分を傷つけるでしょう。 – Volker

答えて

2

あなたはABで定義されてすべてのメソッドを実装する必要があり、どこにもそのインターフェイスBが受理されたインタフェースAを使用することがしたい場合。したがって、New() BB()が含まれます。

基本的に、あなたはこのようなABを埋め込むことができます:あなたが働い例hereを見つけることができます

type A interface { 
    NewA() A 
    C() 
    B 
} 

私の例では、ABのすべてのメソッドをAS構造体に実装する必要があることに注意してください。

また、2 New()の名前を変更する必要があります。 Goでは、戻り値が異なっていても、同じ名前の同じパッケージ内に2つの関数を持つことはできません。

一般的に、structに構造体を作成せずに作成できるため、interfaceでコンストラクタを提供する必要はありません。

+4

インスタンスにメソッドを実行すると予想されるため、インターフェイスに「コンストラクタ」を持つことは非常に直感的です。既存のインスタンスでコンストラクタを呼び出すことは無意味です。 – Adrian

関連する問題