ホームページ > バックエンド開発 > Golang > Go で埋め込みを使用して継承と同様の効果を実現する方法

Go で埋め込みを使用して継承と同様の効果を実現する方法

PHPz
リリース: 2023-04-06 09:36:30
オリジナル
725 人が閲覧しました

Go には、伝統的な意味での「継承」はありません。ただし、Go には継承に似たメカニズム (埋め込み) があります。埋め込みにより、ある型が別の型のプロパティとメソッドを独自の定義に含めて、同じ動作と特性を得ることができます。この記事では、Go で埋め込みを使用して継承と同様のことを実現する方法について説明します。

埋め込み型の構文は次のとおりです。

type MyType struct {
    OtherType
    // MyType 的其他字段
}
ログイン後にコピー

ここで、OtherType はすでに定義されている型です。 OtherType を通じて定義されているプロパティとメソッドにアクセスできます。

簡単な例を見てみましょう。 Personal 型があるとします:

type Person struct {
    Name string
    Age int
}

// 定义一个方法
func (p *Person) SayHello() {
    fmt.Printf("Hello, my name is %s, and I'm %d years old.\n", p.Name, p.Age)
}
ログイン後にコピー

ここで、Student 型を定義したいと思います。これには、person のすべてのプロパティとメソッドが必要です。 、また独自の特定のプロパティとメソッドも必要です。埋め込みを使用してこれを実現できます:

type Student struct {
    Person  // 嵌入 Person 类型
    School  string
}

// 定义一个方法
func (s *Student) Study() {
    fmt.Printf("%s is studying at %s.\n", s.Name, s.School)
}
ログイン後にコピー

これで、Student インスタンスを作成し、そのメソッドを呼び出すことができます:

s := &Student{Person{Name: "John", Age: 20}, "MIT"}
s.SayHello()  // 输出:Hello, my name is John, and I'm 20 years old.
s.Study()     // 输出:John is studying at MIT.
ログイン後にコピー

上記の例では、# を埋め込みます。 ##Person と入力し、s.Person という名前を付けます。これは、People 型のプロパティとメソッドにアクセスするのと同じように、Student のプロパティとメソッドにアクセスできることを意味します。たとえば、s.Name を呼び出して学生の名前を取得することも、s.person.Name を呼び出して person# の名前を取得することもできます。 ## 生徒に対応するインスタンス。 埋め込みは継承に似たメカニズムを提供しますが、まったく同じではありません。 Go の埋め込み型はサブクラスの一部にはなりませんが、そのプロパティの一部になります。これは、埋め込み型はサブタイプでもインターフェイス型でもないため、サブタイプは埋め込み型のメソッドをオーバーライドできないことを意味します。サブタイプが埋め込み型の動作を変更する必要がある場合は、サブタイプにメソッドを追加することで変更できます。

実際には、コードの重複を避けるために埋め込み型を使用することがよくあります。埋め込みを使用すると、複数の型で共有されているコードを 1 つの型に抽出し、その型を他の型に埋め込むことで、コードの重複と複雑さを軽減できます。これはコードの保守性を向上させるだけでなく、特定の機能を実装する際に細部にまで注意を払うのにも役立ちます。

この記事では、Go の埋め込みメカニズムを紹介し、それを使用して継承のような動作を実現する方法を示します。埋め込みメカニズムには独自の制限がありますが、大規模プロジェクトの開発時にコードの重複を最小限に抑え、保守性を向上させるのに役立つ強力なツールです。

以上がGo で埋め込みを使用して継承と同様の効果を実現する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート