Rumah >pembangunan bahagian belakang >Golang >Bolehkah Model Komposisi Go Masih Mengalami Masalah Kelas Asas Yang Rapuh?

Bolehkah Model Komposisi Go Masih Mengalami Masalah Kelas Asas Yang Rapuh?

Mary-Kate Olsen
Mary-Kate Olsenasal
2024-10-27 12:18:02958semak imbas

 Can Go's Composition Model Still Suffer From the Fragile Base Class Problem?

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!

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