ホームページ >バックエンド開発 >Golang >Go はポリモーフィズムを強制せずにどのように実装しますか?

Go はポリモーフィズムを強制せずにどのように実装しますか?

Mary-Kate Olsen
Mary-Kate Olsenオリジナル
2024-11-06 02:29:02426ブラウズ

How Does Go Implement Polymorphism Without Enforcing It?

Go のポリモーフィズム

オブジェクト指向プログラミングでは、ポリモーフィズムにより、単一のインターフェイスで複数の型のオブジェクトを参照できます。 Go はこの概念を厳密に強制しませんが、同様の動作を実現するための代替方法を提供します。

次のコード スニペットを考えてみましょう。

type Foo struct {
   ...
}

type Bar struct {
   Foo
   ...
}

func getFoo() Foo {
   return Bar{...}
}

お気づきのとおり、Go では、このコードはgetFoo() が Foo のインスタンスを返さなければならないことを示すエラー。ポリモーフィックな動作を実現するには、Go でインターフェイスと合成を利用できます。

package main

import "fmt"

type Foo interface {
   printFoo()
}

type FooImpl struct {

}

type Bar struct {
   FooImpl
}

type Bar2 struct {
   FooImpl
}

func (f FooImpl)printFoo(){
    fmt.Println("Print Foo Impl")
}

func getFoo() Foo {
   return Bar{}
}

func main() {
    fmt.Println("Hello, playground")
    b := getFoo()
    b.printFoo()
}

この更新された例では、

  • 関数 printFoo を宣言する Foo というインターフェイスを定義します。
  • FooImpl は Foo インターフェイスを実装します。
  • Bar と Bar2 は FooImpl 型を埋め込む構造体です。
  • getFoo() 関数は Foo インターフェイスを実装する値を返します。 Bar または Bar2 インスタンスを返します。
  • getFoo() から返された値に対して printFoo を呼び出すと、Go は基になる型に基づいてメソッドを動的にディスパッチします。

この手法は、インターフェイスと合成を利用して Go でポリモーフィズムを実現する方法を提供し、単一のインターフェイスをさまざまな具体的な型に使用できるようにします。

以上がGo はポリモーフィズムを強制せずにどのように実装しますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。