ホームページ  >  記事  >  バックエンド開発  >  Golangでコンポジションを使った「継承」を実装する方法

Golangでコンポジションを使った「継承」を実装する方法

PHPz
PHPzオリジナル
2023-04-06 08:54:38688ブラウズ

Golang は、多くのユニークな機能を備えた強力で人気のあるプログラミング言語です。その 1 つは、継承ではなく合成によるオブジェクト指向プログラミングの実装です。 Golang は直接の継承方法を提供していませんが、コンポジションを通じて継承に似た効果を実現できます。

今回はGolangでコンポジションを使って「継承」を実装する方法を紹介します。

オブジェクト指向プログラミングとは何ですか?

オブジェクト指向プログラミングの実装を紹介する前に、まずオブジェクト指向プログラミングとは何かを理解する必要があります。簡単に言えば、オブジェクト指向プログラミングはプログラミング パラダイムです。その主な考え方は、プログラム内のオブジェクトを独立したエンティティとして扱い、それらのデータと動作を組み合わせて、より高い柔軟性と信頼性を実現することです。コードを再利用します。

オブジェクト指向プログラミングの主な考え方は、次の 3 つの側面に簡単に要約できます。

  • カプセル化: クラスの実装の詳細をクラス内に隠し、パブリック インターフェイスを提供するこれはクラスのデータ セキュリティを保護するために使用されます;
  • 継承: サブクラスを継承することにより、これに基づいて親クラスのコードを再利用および拡張できます;
  • ポリモーフィズム: 同じタイプのオブジェクトでも、異なる場合に異なる動作を示す可能性があります。

Golang の場合、オブジェクト指向プログラミングはサポートされていますが、従来の継承は提供されません。これは、Golang の設計者は、継承によってクラス階層の密結合が生じる可能性があると考えているためであり、この密結合により、大規模なプロジェクトではコードの肥大化や保守の困難な問題が容易に発生する可能性があります。継承の代わりに、コンポジションを通じてコードを再利用することもできます。

コンポジションの実装

コンポジションとは、オブジェクトが他のオブジェクトを「包含」し、組み合わせを通じてコードの再利用を実現することを意味します。 Golangでは、Structを使用してCompositionを実装できます。

Composition を使用して継承をシミュレートする方法を見てみましょう。

2 つの構造があるとします。

type Animal struct {
    Name string
    Age  int
}

type Dog struct {
    Animal
    Breed string
}

この例では、Animal 構造は動物を表し、名前と年齢という 2 つの属性が含まれています。 Dog 構造体には Animal タイプのフィールドが含まれており、Breed 属性が追加されます。この方法は、組み合わせによって継承のような効果を実現します。

次のメソッドを使用して Dog オブジェクトを初期化できます:

dog := Dog{
    Animal: Animal{Name: "大黄", Age: 2},
    Breed:  "拉布拉多",
}

fmt.Println(dog.Name, dog.Age, dog.Breed)

上の例では、Animal オブジェクトを含む新しい Dog オブジェクトを作成し、その名前、年齢、および名前を設定しました。品種の特性。次に、これらのプロパティを出力します。出力は次のようになります。

大黄 2 拉布拉多

出力から、Dog オブジェクトの Name プロパティと Age プロパティが Animal オブジェクトから継承されており、これらを含めることで何かを実現していることがわかります。継承と同様の効果。

ただし、Dog 構造体は Animal 構造体を継承するのではなく、Animal 構造体を組み合わせて実装されることに注意してください。

言い換えると、Composition を使用して、より複雑なクラス階層を定義できます。たとえば、人間を表す構造体を定義できます。この構造体には、Heartbeat という名前の構造体が含まれています。Heartbeat 構造体は、心拍を表します。

type Heartbeat struct {
    rate int
}

func (h *Heartbeat) SetRate(rate int) {
    h.rate = rate
}

func (h *Heartbeat) GetRate() int {
    return h.rate
}

type Human struct {
    Name     string
    Age      int
    Heartbeat Heartbeat
}

Human 構造体に Heartbeat 構造体を組み込み、Heartbeat を Human 構造体のフィールドにします。このようにして、Human 構造体内の Heartbeat 構造体のメソッドにアクセスし、ハートビート値を設定および取得することができます。

概要

Golang は従来の継承方法を提供していませんが、コンポジションを使用することで継承に似た効果を実現できます。 Comboposition を使用すると、より簡潔で柔軟なクラス階層を構築できるため、大規模なプロジェクトでのコードの保守と拡張が容易になります。同時に、コンポジションは、オブジェクト指向プログラミングの他の機能と同様に、より効率的で再利用可能なコードを作成するのにも役立ちます。

以上がGolangでコンポジションを使った「継承」を実装する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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