Go ツアー チュートリアルのほとんどを読みましたが、Go のインターフェイス プログラミング モデルが OOP とどのように比較されるかについてはまだよくわかりません。
「Goで考える」方法を誰かが説明できますか?
インターフェイスを定義し、インターフェイスに基づいてオブジェクトを作成する方法がわかりません。
Go はコンパイル時に具体的な実装を暗黙的に作成しますか?
Go のインターフェイス システムは、構造型付けに似ています。Python コードのスニペットを考えてみましょう:
def foo(bar):
bar.baz(5)
このスニペットでは、具象型が何であるかはわかりませんが、単一の引数を受け入れるメソッドbar
が必要であると言えます。のクラスを書いているとき、この「インターフェース」を実装していることを宣言する必要がないことに注意してください (整数を取るメソッドを持っています)。シングルで呼び出されたときに正しく機能するメソッドを作成するだけで、インスタンスをメソッドに渡すことができます。baz
int
bar
baz
baz
int
foo
Go も同様に動作しますが、コンパイル時にすべてがチェックされます。Python ではfoo
、メソッドを持たないクラスのインスタンスをメソッドに渡すbaz
と、実行時例外が発生します。Goでは、そのインターフェイスのインスタンスを取るbaz
の型のメソッドと状態でインターフェイスを定義します。foo
現在、単一のメソッドを持つすべての型は、必要な型を満たしています。baz
int
foo
OOP が通常解決しようとする問題の 1 つは、ポリモーフィズム、または 2 つの異なるクラスが同じように動作するインスタンスを持つ能力です。通常、OOP では継承を使用してこれを実現します。基本クラスは、他のクラスが拡張する最小限のインターフェイスを定義します。Base クラスのサブクラスはすべて Base クラスとして使用できます。
Go は継承ではなくインターフェイスを使用して同じことを行います。インターフェイスは、動作の「説明」です。インターフェイスで説明されている各メソッドを実装することによって、この説明を満たすかどうかは、Go の個々の型次第です。Type がインターフェイスに記述されているすべてのメソッドを実装する場合、自動的にインターフェイスを満たし、コンパイラによってそのインターフェイスに自動的にキャストできます。
従来の (Java) OO は、クラス階層に関するものです。クラス、いくつかの抽象、いくつかの最終、およびインターフェースを使用して問題をモデル化します。次に、実装を提供します。
Go では逆に、具体的な型から始めて、ロジックを実装できます。有用な抽象化が出現した場合、または必要な場合: それをインターフェイスにパックし、このインターフェイス タイプを使用するようにコードをリファクタリングします。