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 サイトの他の関連記事を参照してください。