1

Go ツアー チュートリアルのほとんどを読みましたが、Go のインターフェイス プログラミング モデルが OOP とどのように比較されるかについてはまだよくわかりません。

「Goで考える」方法を誰かが説明できますか?

インターフェイスを定義し、インターフェイスに基づいてオブジェクトを作成する方法がわかりません。

Go はコンパイル時に具体的な実装を暗黙的に作成しますか?

4

3 に答える 3

2

Go のインターフェイス システムは、構造型付けに似ています。Python コードのスニペットを考えてみましょう:

def foo(bar):
   bar.baz(5)

このスニペットでは、具象型が何であるかはわかりませんが、単一の引数を受け入れるメソッドbarが必要であると言えます。のクラスを書いているとき、この「インターフェース」を実装していることを宣言する必要がないことに注意してください (整数を取るメソッドを持っています)。シングルで呼び出されたときに正しく機能するメソッドを作成するだけで、インスタンスをメソッドに渡すことができます。bazintbarbazbazintfoo

Go も同様に動作しますが、コンパイル時にすべてがチェックされます。Python ではfoo、メソッドを持たないクラスのインスタンスをメソッドに渡すbazと、実行時例外が発生します。Goでは、そのインターフェイスのインスタンスを取るbazの型のメソッドと状態でインターフェイスを定義します。foo現在、単一のメソッドを持つすべての型は、必要な型を満たしています。bazintfoo

于 2013-01-14T17:46:11.563 に答える
2

OOP が通常解決しようとする問題の 1 つは、ポリモーフィズム、または 2 つの異なるクラスが同じように動作するインスタンスを持つ能力です。通常、OOP では継承を使用してこれを実現します。基本クラスは、他のクラスが拡張する最小限のインターフェイスを定義します。Base クラスのサブクラスはすべて Base クラスとして使用できます。

Go は継承ではなくインターフェイスを使用して同じことを行います。インターフェイスは、動作の「説明」です。インターフェイスで説明されている各メソッドを実装することによって、この説明を満たすかどうかは、Go の個々の型次第です。Type がインターフェイスに記述されているすべてのメソッドを実装する場合、自動的にインターフェイスを満たし、コンパイラによってそのインターフェイスに自動的にキャストできます。

于 2013-01-14T17:34:36.190 に答える
0

従来の (Java) OO は、クラス階層に関するものです。クラス、いくつかの抽象、いくつかの最終、およびインターフェースを使用して問題をモデル化します。次に、実装を提供します。

Go では逆に、具体的な型から始めて、ロジックを実装できます。有用な抽象化が出現した場合、または必要な場合: それをインターフェイスにパックし、このインターフェイス タイプを使用するようにコードをリファクタリングします。

于 2013-01-15T13:45:58.783 に答える