2016-08-23 5 views
-2

これらは2つの別個の質問か1つであるべきかどうかわかりませんが、2つの部分の1つの質問と思われます - どのようにインターフェイスを使用する予定ですか?インターフェイスに依存するgolangインターフェイス

インターフェイスのメソッドはグローバルスコープです。インターフェイスAとインターフェイスBが両方とも同じメソッドFooを実装していて、引数や戻り値の型が異なる場合は、両方で実装できません。同じタイプから同じ時間。たとえば、あるインタフェースでGetBytes()メソッドを返し、戻り値の型が[]バイトで、別の([]バイト、エラー)メソッドでこの問題を解決する方法はありますか?

別の問題は、同じレイヤーで定義されたインターフェイスBを返すメソッドを持つインターフェイスAを定義しようとするときです。今、Aを実装するオブジェクトを作成したい場合、Bを実装する構造体を返すと、このメソッドはAでメソッドを実装し、Bに依存関係を作成するように推論するほどスマートではありません。最初の場所でインターフェイスが動作する方法のポイント。どうすればこの問題を回避できますか?例えば

、私が持っている場合は、次の構造体のための

type B interface { 
    Bar() 
} 

type A interface { 
    Foo() B 
} 

を:

type b_impl struct{} 

func (b b_impl) Bar() {} 

type a_impl struct{} 

fooメソッド

func (a a_impl) Foo() b_impl {} 

は、インタフェースAを満たしていないと私はする必要がありそれを作ってください:

func (a a_impl) Foo() B {} 

これはBが宣言されているパッケージに依存します。

+0

「どのようにこの問題を解決する必要がありますか?」 Goはメソッドのオーバーロードをサポートしていないため、できません。 https://golang.org/doc/faq#overloadingを参照してください。私はあなたの第二の質問が答えようとするほど十分に理解していません。おそらくコード例を提供すると助けになるでしょう。 – smarx

+0

ありがとうございます@smarx - 私は2番目の部分の詳細についての質問を編集しました – gsf

+0

私はあなたの2番目の問題についてもできることは何もないと思います。 – smarx

答えて

2

1番目の質問: 別のタスクを実行するには、異なる機能名を設定する必要があります。 strconvパッケージの標準ライブラリを見て、そこで何が解決されるかを見てみましょう。https://golang.org/pkg/strconv/#pkg-index

ここで別の関数の宣言を見てください。さまざまな種類の関数があります。

あなたはFooInt目的球を期待するのであれば、あなたのインターフェースもFooInter、...

第二の問題でなければなりません:小さな一例として。 io.Writerインターフェイスを使用する場合は、ioパッケージ全体をインポートする必要はありません。 Writer宣言を独自のパッケージにコピーするのは大丈夫です。これを正しく行うと、すべてのio.Writer実装が自動的に独自のWriterインターフェイスを実装します。他のコメントを読んだ後

多分あなたは別の状況があります。

はのは、インターフェイスaの化合物。表とb.B.とパッケージAとBがあるとしましょう

type A interface{ 
    Foo() b.B 
} 

の場合、a.Aの実装を記述する必要がある場合は、パッケージbをインポートする必要があります。しかし、これはバイナリを大きくしません。なぜなら、常にbに依存するパッケージaをインポートする必要があるからです。

+0

、理論的ではない。これらは私が実際に持っている2つの問題です。 変更が必要なのは良い提案ですが、私が依存するすべての所有者ではないため、「私」は変更できません。 2番目の質問では、io.Writerの例は私の場合とは関係ありません。明らかにio.Writerのように自明ではないインターフェイスは、いくつかのインターフェイスが必要です。私は依存関係が暗黙的に得られる標準ライブラリを書いていないので、この問題は非常に現実的です。 – gsf

+0

申し訳ありませんが、少し難しいですね。これは意図ではなく、英語は私の母国語ではありません。しかし、既存のコードがあれば、既存の構造と実装する必要のある部分についてもう少し詳しく知ることができます。あなたの問題はio.Writerではないことが分かりました。私はあなたの問題を理解しているすべての追加のコメントを読んだ後。外部パッケージaが外部インターフェースb.Bを使用している場合は、これを解決しパッケージbをインポートする他の方法はありません。 – apxp

+0

私はいくつかのインターフェイスを含むプロトコルを持っています。 Aは両方とも同じパッケージに属します。そのため、このパッケージに直接依存せずにこれらのインターフェイスの実装を作成することは不可能です。これは私がそれを持っていなければ可能です - それが問題です。 – gsf

関連する問題