ホームページ  >  記事  >  バックエンド開発  >  Go はどのようにして継承なしでポリモーフィズムを実現するのでしょうか?

Go はどのようにして継承なしでポリモーフィズムを実現するのでしょうか?

DDD
DDDオリジナル
2024-11-06 06:45:02291ブラウズ

How does Go Achieve Polymorphism without Inheritance?

Go 言語のポリモーフィズム

お気づきのとおり、Go は継承によるポリモーフィズムという従来のオブジェクト指向の概念をサポートしていません。ただし、インターフェイスと合成を使用して同様の結果を達成する他の方法もあります。

インターフェイスと合成

Go では、インターフェイスは、型が実装する必要があるメソッドを指定するコントラクトを定義します。 。合成を使用すると、他の型を埋め込んで新しい型を作成できます。インターフェイスと構成を組み合わせることで、ポリモーフィズムの一種を実現できます。

たとえば、次のコードを考えてみましょう:

<code class="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()
}</code>

この例では:

  • Foo インターフェイスは printFoo メソッドを定義します。
  • FooImpl は printFoo メソッドを使用して Foo インターフェイスを実装します。
  • Bar は FooImpl を埋め込むため、Foo インターフェイスを実装します。
  • Bar2 は FooImpl を埋め込み、またFoo インターフェイスを実装します。
  • getFoo は Foo 型の値を返します。 Bar と Bar2 はどちらも Foo インターフェイスを実装しているため、Bar2 は getFoo の有効な戻り値です。
  • main は getFoo を呼び出して Foo 値を取得し、その値に対して printFoo メソッドを呼び出します。

このコードを実行すると、次の出力が表示されます。

Hello, playground
Print Foo Impl

これは、インターフェイスと構成を使用して Go でポリモーフィズムの形式を実現する方法を示しています。インターフェイスを定義すると、さまざまな型が共通のメソッド セットを共有するようにできます。型を埋め込むことで、他の複数の型の機能を組み合わせた新しい型を作成できます。これにより、さまざまな型を統一した方法で扱うコードを作成できます。

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

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