Go 言語には、従来のオブジェクト指向言語で定義されている「クラス」がないため、いわゆる「継承」はありません。ただし、Go 言語には、埋め込みと呼ばれる、合成を通じて同様の継承を実現する方法が用意されています。
埋め込みを使用すると、型を別の型に埋め込むことができるため、埋め込まれた型は、インターフェイスやその他の手段を介してアクセスすることなく、埋め込まれている型のプロパティやメソッドに直接アクセスできます。このプロセスは従来の「継承」に似ていますが、より柔軟です。
以下では、いくつかの例を使用して、埋め込みを使用して継承のような機能を実現する方法を示します。
最初に、犬、猫、人といった基本的な構造をいくつか定義します。
type Dog struct { name string } func (d Dog) Bark() { fmt.Println(d.name, ": 汪汪汪!") } type Cat struct { name string } func (c Cat) Mew() { fmt.Println(c.name, ": 喵喵喵!") } type Person struct { name string } func (p Person) Speak() { fmt.Println(p.name, ": 你好!") }
次に、動物タイプを作成します。犬や猫を「継承」することができ、色や走る速度などの独自の特性と方法もあります。次のように定義できます:
type Animal struct { Dog Cat color string runSpeed int } func (a Animal) Run() { fmt.Println(a.color, "的动物以", a.runSpeed, "km/h的速度奔跑!") }
この定義では、Animal タイプに Dog タイプと Cat タイプが埋め込まれています。これは、Animal 型でインスタンス化されたオブジェクトが、Dog および Cat 型のプロパティとメソッドに直接アクセスできることを意味します。また、動物の色や走行速度を表すために color や runSpeed などの動物タイプの独自のプロパティとメソッドを定義したり、動物の走行動作を記述する Run メソッドを定義したりすることもできます。
次に、Animal オブジェクトを作成して、それがどのように機能するかを見てみましょう:
func main() { d := Dog{name: "小黑"} c := Cat{name: "小白"} a := Animal{d, c, "黑白相间", 50} a.Bark() // 小黑 : 汪汪汪! a.Mew() // 小白 : 喵喵喵! a.Run() // 黑白相间 的动物以 50 km/h的速度奔跑! }
Dog および Cat タイプを埋め込むことによって、Animal オブジェクトが Bark メソッドと Mew メソッドを直接呼び出すことができることがわかります。インターフェースまたは他の手段を使用します。このアプローチにより、従来の意味での「継承」を使用せずに同様の機能を実現できます。
カスタム タイプを別のカスタム タイプに埋め込んで、継承と同様の効果を実現できます。ここで、Person タイプと Student タイプを定義し、People タイプを Student タイプに埋め込みましょう。
type Person struct { name string age int sex string } type Student struct { Person class string score float64 }
この定義では、Student タイプは person タイプを埋め込みます。 Student タイプのオブジェクトをインスタンス化する場合、Person のプロパティとメソッドを使用できます。たとえば、学生オブジェクトをインスタンス化し、名前、年齢、性別、クラス、学年を設定できます。
func main() { s := Student{ Person: Person{ name: "小明", age: 18, sex: "男", }, class: "高三一班", score: 92.5, } fmt.Println("姓名:", s.name) fmt.Println("年龄:", s.age) fmt.Println("性别:", s.sex) fmt.Println("班级:", s.class) fmt.Println("成绩:", s.score) }
このプログラムを実行すると、次の出力が表示されます。 Student オブジェクトが、名前、年齢、性別などの属性を含む、Person 型オブジェクトのプロパティとメソッドに直接アクセスできることがわかります。
ネストされた埋め込み姓名: 小明 年龄: 18 性别: 男 班级: 高三一班 成绩: 92.5
このタイプの定義では、Animal タイプを Zoo タイプに埋め込みます。このようにして、Zoo タイプは、Run メソッドを含む Animal タイプのプロパティとメソッドに直接アクセスできます。動物園の名前と住所を出力する別の ShowInfo メソッドを定義し、Animal タイプの Run メソッドを呼び出して動物が走っている様子を表示します。
ここで、動物園オブジェクトを作成し、そのメソッドをテストします:
type Zoo struct { Animal name string address string } func (z Zoo) ShowInfo() { fmt.Println("这是", z.name, ", 地址是", z.address) z.Run() }
このプログラムを実行すると、次のような出力が表示されます:
func main() { d := Dog{name: "小黑"} c := Cat{name: "小白"} a := Animal{d, c, "黑白相间", 50} z := Zoo{a, "北京动物园", "北京市海淀区清华科技园路"} z.ShowInfo() }
By が表示されます。 Animal タイプを Zoo タイプにネストすると、動物園の情報や動物の動作を表示できる、より多くの機能を備えたタイプを作成できます。
まとめ
Go 言語には従来のオブジェクト指向言語で定義されていたクラスや継承の概念がありませんが、埋め込みの概念により、より柔軟に同様の機能を実現できます。利便性。上記の例から、埋め込みによりサブタイプを含む型を簡単に作成し、それらのメソッドとプロパティを簡単に呼び出すことができることがわかります。
以上がgolangで継承する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。