Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Penjelasan terperinci tentang bagaimana golang mencapai kesan pewarisan

Penjelasan terperinci tentang bagaimana golang mencapai kesan pewarisan

PHPz
PHPzasal
2023-04-11 10:39:25820semak imbas

Dalam bahasa Go, tiada konsep kelas, jadi tiada pewarisan dalam bahasa berorientasikan objek tradisional. Walau bagaimanapun, dalam bahasa Go, kesan seperti warisan boleh dicapai melalui gabungan struktur dan medan tanpa nama.

Pertama, mari kita lihat penggunaan gabungan dalam bahasa go. Komposisi merujuk kepada membenamkan satu struktur dalam struktur lain untuk mencapai penggunaan semula kod dan modularisasi. Sebagai contoh, kita boleh mentakrifkan struktur Orang:

type Person struct {
    Name string
    Age int
}

Kemudian, kita boleh membenamkan struktur Orang dalam struktur Pelajar:

type Student struct {
    Person
    School string
}

Dengan cara ini, struktur Pelajar Badan bukan sahaja mempunyai sifatnya sendiri, tetapi juga boleh mengakses sifat dalam kelas induk melalui harta Orang. Contohnya:

s := Student{
    Person: Person{Name: "Tom", Age: 18},
    School: "CMS",
}
fmt.Println(s.Name) // Tom
fmt.Println(s.Age)  // 18

Anda juga boleh mengakses kaedah dalam kelas induk melalui atribut Person terbenam:

func (p *Person) SayHello() {
    fmt.Printf("Hello, my name is %s.\n", p.Name)
}

type Student struct {
    Person
    School string
}

func main() {
    s := Student{
        Person: Person{Name: "Tom", Age: 18},
        School: "CMS",
    }
    s.SayHello() // Hello, my name is Tom.
}

Walau bagaimanapun, jika kita ingin mentakrifkan perkara yang sama seperti struktur Person dalam struktur Pelajar Apakah yang perlu saya lakukan jika saya menemui kaedah dengan nama yang sama? Pada masa ini, anda perlu menggunakan ciri medan tanpa nama.

Medan tanpa nama ialah jenis medan khas yang tidak menyatakan nama, hanya jenis. Melalui medan tanpa nama, pembolehubah dan kaedah dengan nama yang sama dalam kelas induk boleh dirujuk dalam subkelas. Kita boleh menggunakan kaedah berikut untuk mentakrifkan kaedah dengan nama yang sama dengan struktur Orang dalam struktur Pelajar:

type Person struct {
    Name string
    Age int
}

func (p *Person) SayHello() {
    fmt.Printf("Hello, my name is %s.\n", p.Name)
}

type Student struct {
    Person
    School string
}

func (s *Student) SayHello() {
    fmt.Printf("Hello, my name is %s and I am a student of %s.\n", s.Name, s.School)
}

func main() {
    s := Student{
        Person: Person{Name: "Tom", Age: 18},
        School: "CMS",
    }
    s.SayHello() // Hello, my name is Tom and I am a student of CMS.
}

Dalam kod di atas, kami mentakrifkan kaedah SayHello dengan nama yang sama dengan struktur Orang dalam struktur Pelajar , dan akses sifat dalam kelas induk melalui s.Name dan s.School.

Ringkasnya, bahasa Go tidak mempunyai konsep pewarisan, tetapi melalui gabungan struktur dan medan tanpa nama, kesan yang serupa dengan pewarisan boleh dicapai.

Atas ialah kandungan terperinci Penjelasan terperinci tentang bagaimana golang mencapai kesan pewarisan. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn