Rumah >pembangunan bahagian belakang >Golang >Bolehkah Model Komposisi Go Masih Mengalami Masalah Kelas Asas Yang Rapuh?
Isu Kelas Asas Rapuh dalam Go: Walaupun Komposisi Daripada Pewarisan
Masalah kelas asas yang rapuh timbul apabila perubahan kepada kelas asas boleh menyebabkan yang tidak dijangka tingkah laku dalam kelas terbitan. Masalah ini biasanya dikaitkan dengan pewarisan, di mana kelas terbitan mewarisi kaedah dan medan kelas asasnya.
Dalam Go, pewarisan tidak dilaksanakan. Sebaliknya, Go menggunakan komposisi, di mana struct boleh mengandungi contoh struct lain. Walau bagaimanapun, sesetengah pihak berpendapat bahawa isu kelas asas yang rapuh masih boleh wujud dalam Go apabila bekerja dengan jenis terbenam.
Jenis terbenam mempromosikan medan dan kaedah jenis terbenam kepada jenis pembalut. Walaupun ini menyediakan akses yang mudah, ia menghapuskan polimorfisme. Ini bermakna kaedah yang ditakrifkan dalam jenis terbenam tidak boleh ditindih dalam jenis pembalut dan sebarang panggilan kaedah yang dibuat oleh jenis terbenam akan sentiasa menggunakan definisi asal.
Akibatnya, masalah kelas asas yang rapuh wujud. dalam Go dalam bentuk yang dikurangkan. Perubahan kepada kaedah atau medan jenis terbenam boleh menjejaskan jenis pembalut, tetapi hanya jika jenis pembalut tidak menentukan kaedahnya sendiri dengan nama yang sama.
Contoh
Pertimbangkan kod Java berikut, di mana Kaunter kelas asas mengandungi kaedah kenaikan inc() dan kaedah kenaikan demi incBy(). Kelas terbitan MyCounter mengatasi inc() untuk memanggil incBy(1).
<code class="java">class Counter { int value; void inc() { value++; } void incBy(int n) { value += n; } } class MyCounter extends Counter { @Override void inc() { incBy(1); } }</code>
Jika kaedah incBy() dalam kelas asas ditukar untuk menggunakan gelung, kelas terbitan MyCounter akan memasuki gelung tak terhingga kerana inc() memanggil incBy() yang memanggil inc() sekali lagi:
<code class="java">void incBy(int n) { for (; n > 0; n--) { inc(); } }</code>
Dalam Go, contoh yang sama tidak menunjukkan masalah ini kerana Go tidak menyokong kaedah mengatasi dalam jenis terbenam:
<code class="go">type Counter struct { value int } func (c *Counter) Inc() { c.value++ } func (c *Counter) IncBy(n int) { c.value += n } type MyCounter struct { *Counter } func (m *MyCounter) Inc() { m.IncBy(1) }</code>
Walaupun kaedah IncBy() dalam jenis Counter diubah suai untuk menggunakan gelung, jenis MyCounter tidak mewarisi tingkah laku ini kerana ia tidak mentakrifkan kaedah bernama Inc(). Sebaliknya, ia memanggil kaedah inc() asal yang ditakrifkan dalam jenis Kaunter.
Oleh itu, masalah kelas asas yang rapuh bukanlah kebimbangan utama dalam Go kerana kekurangan polimorfisme dalam jenis terbenam, yang menghalang tingkah laku yang tidak dijangka apabila mengubah suai jenis terbenam.
Atas ialah kandungan terperinci Bolehkah Model Komposisi Go Masih Mengalami Masalah Kelas Asas Yang Rapuh?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!