cara menggabungkan atribut dalam multi-warisan

Mewarisi berulang kali dari 2 kelas yang memiliki orang tua yang sama, saya termasuk dalam kasus klasik yang mewarisi 2 kali atribut yang sama. Saya ingin menggabungkan 2 atribut menjadi satu dan mencoba melakukannya dengan tidak terdefinisi, tetapi saya mendapat kesalahan kompilasi. Solusi lain yang saya lihat adalah mengganti nama atribut dari salah satu dari kedua orang tuanya, tetapi seperti yang saya pahami, setiap instance kelas D saya akan memiliki atribut yang tidak berguna dan bukan itu yang saya inginkan...

Error: Undefine subclause lists name of frozen feature or attribute or C external. What to do: unless you can change the status of the feature in the parent, remove its name from Undefine subclause since it cannot be undefined.

Cara menggabungkan 2 atribut dari kelas yang diwarisi berulang kali

class A
    serial: STRING

end -- class A

class B

inherit
    A

end -- class B


class C

inherit
    A

end -- class C


class D

inherit
    B
        undefine 
            serial -- error seems to appear here in that case
        end
    C

end -- class D

person Pipo    schedule 15.10.2019    source sumber
comment
Kelas C tidak digunakan dalam contoh dan dapat dihapus dengan aman.   -  person Alexander Kogtenkov    schedule 15.10.2019
comment
@AlexanderKogtenkov Maksud saya kelas D mewarisi B & C, terlambat untuk memposting kemarin ;-) Terima kasih!   -  person Pipo    schedule 15.10.2019


Jawaban (2)


Jika ada dua atribut yang tidak terkait (tidak berasal dari induk yang sama) yang ingin Anda gabungkan, Anda harus mendefinisikan ulang keduanya:

class A
feature
    serial: STRING
end

class B
feature
    serial: STRING
end

class C
inherit
    A
         redefine
               serial
         end
    B
         redefine
               serial
         end
feature
    serial: STRING
end

Seperti yang telah Anda lihat, kompiler tidak akan membiarkan Anda membatalkan definisi suatu atribut, meskipun tujuannya adalah untuk menggabungkannya dengan atribut lain.

person Eric Bezault    schedule 15.10.2019
comment
Terima kasih Eric! dalam hal mengganti nama juga? Itu adalah kasusku! Terima kasih Anda menghemat banyak waktu saya! - person Pipo; 15.10.2019

Tidak ada alasan untuk membatalkan definisi fitur yang akan digabungkan dengan versi yang sama yang berasal dari jalur pewarisan berbeda. Pada contoh, atribut serial tidak diubah pada B, C, dan D. Oleh karena itu, mewarisi dari B dan C tanpa adaptasi apa pun diperbolehkan:

class D inherit
    B
    C
end
person Alexander Kogtenkov    schedule 15.10.2019
comment
Maaf, saya rasa pertanyaan saya kurang jelas, saya mengeditnya semoga kali ini lebih jelas - person Pipo; 15.10.2019
comment
@Pipo Jawabannya tetap sama: simpan saja atribut dengan nama yang sama, maka akan digabungkan menjadi satu tanpa kesalahan. - person Alexander Kogtenkov; 15.10.2019
comment
Eric memberi saya alasannya, contoh saya tidak lengkap karena saya mengganti nama atribut menjadi kelas B! mengganti nama menjadi serial lagi menjadi D dan mendefinisikannya kembali memberi saya solusinya! - person Pipo; 15.10.2019
comment
@Pipo Saya sarankan mengedit pertanyaan untuk mencerminkan masalah yang Anda hadapi. Jawaban saya membahas masalah yang sama sekali berbeda yang dinyatakan dalam pertanyaan awal. - person Alexander Kogtenkov; 16.10.2019
comment
ya, tapi kemudian Anda harus mengedit jawaban Anda, jadi saya tidak ingin Anda harus mengedit seluruh jawaban Anda, itulah alasan saya tidak ingin mengeditnya - person Pipo; 16.10.2019