Walaupun merangkumi komposisi berbanding warisan, isu kelas asas yang rapuh masih boleh timbul dalam Go, walaupun dalam keadaan yang kurang teruk bentuk.
Masalah berlaku apabila perubahan kepada kelas asas memecahkan subkelasnya. Dalam bahasa dengan kaedah maya (seperti Java), kaedah mengatasi dalam subkelas boleh membawa kepada tingkah laku yang tidak dijangka jika kelas asas diubah suai.
Dalam Go, walau bagaimanapun, terdapat tiada polimorfisme (boleh ditindih kaedah). Apabila membenamkan jenis, kaedah terbenam dinaikkan pangkat kepada struktur pembalut tetapi tidak boleh ditindih. Ini mengurangkan masalah kelas asas yang rapuh, kerana kaedah yang digalakkan tidak boleh diubah oleh subkelas.
Dalam Java:
<code class="java">class Counter { int value; void inc() { value++; } void incBy(int n) { value += n; } } class MyCounter extends Counter { void inc() { incBy(1); } }</code>
Jika Counter.incBy() diubah suai kepada inc() berkali-kali, MyCounter akan memasuki gelung tak terhingga.
In Go:
<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 dengan pengubahsuaian yang sama kepada Counter.incBy() seperti dalam contoh Java, MyCounter masih akan berfungsi dengan betul, kerana ia secara terus memanggil Counter.Inc(). Kaedah kelas asas tidak terjejas oleh sebarang perubahan dalam subkelas.
Walaupun isu kelas asas yang rapuh kurang berleluasa dalam Go kerana ketiadaan polimorfisme, adalah penting untuk mempertimbangkan implikasi potensi perubahan kelas asas apabila membenamkan jenis dalam struct.
Atas ialah kandungan terperinci Adakah Model Komposisi Go Mengurangkan Isu Kelas Asas Rapuh?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!