golangで継承する方法

王林
リリース: 2023-05-22 15:25:07
オリジナル
911 人が閲覧しました

Go 言語には、従来のオブジェクト指向言語で定義されている「クラス」がないため、いわゆる「継承」はありません。ただし、Go 言語には、埋め込みと呼ばれる、合成を通じて同様の継承を実現する方法が用意されています。

埋め込みを使用すると、型を別の型に埋め込むことができるため、埋め込まれた型は、インターフェイスやその他の手段を介してアクセスすることなく、埋め込まれている型のプロパティやメソッドに直接アクセスできます。このプロセスは従来の「継承」に似ていますが、より柔軟です。

以下では、いくつかの例を使用して、埋め込みを使用して継承のような機能を実現する方法を示します。

  1. 基本的な例

最初に、犬、猫、人といった基本的な構造をいくつか定義します。

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 メソッドを直接呼び出すことができることがわかります。インターフェースまたは他の手段を使用します。このアプローチにより、従来の意味での「継承」を使用せずに同様の機能を実現できます。

  1. カスタム タイプの埋め込み

カスタム タイプを別のカスタム タイプに埋め込んで、継承と同様の効果を実現できます。ここで、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 型オブジェクトのプロパティとメソッドに直接アクセスできることがわかります。

ネストされた埋め込み
  1. 1 つの型内で複数の型をネストすることも可能です。 Animal タイプを別のタイプに埋め込んで、より多くの機能を実現できます。たとえば、ここで Zoo タイプを定義してみましょう。
姓名: 小明
年龄: 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 サイトの他の関連記事を参照してください。

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