วิธีผสานแอตทริบิวต์ในการสืบทอดหลายรายการ

การสืบทอดซ้ำจาก 2 คลาสที่มีพาเรนต์เดียวกัน ฉันตกอยู่ในกรณีคลาสสิกของการสืบทอดแอททริบิวต์เดียวกัน 2 ครั้ง ฉันต้องการรวมแอตทริบิวต์ 2 รายการเป็นหนึ่งเดียวและพยายามทำโดยไม่กำหนด แต่ทำให้ฉันเกิดข้อผิดพลาดในการคอมไพล์ วิธีแก้ไขปัญหาอื่นที่ฉันเห็นคือการเปลี่ยนชื่อแอตทริบิวต์จากผู้ปกครองคนใดคนหนึ่ง แต่เนื่องจากฉันเข้าใจว่าแต่ละอินสแตนซ์ของคลาส D ของฉันจะมีแอตทริบิวต์ที่ไม่มีประโยชน์ซึ่งไม่ใช่สิ่งที่ฉันต้องการ...

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.

วิธีผสาน 2 คุณลักษณะจากคลาสที่สืบทอดซ้ำๆ

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 แหล่งที่มา
comment
ไม่ได้ใช้คลาส C ในตัวอย่างและสามารถลบออกได้อย่างปลอดภัย   -  person Alexander Kogtenkov    schedule 15.10.2019
comment
@AlexanderKogtenkov ฉันหมายถึงคลาส D สืบทอด B & C สายเกินไปที่จะโพสต์เมื่อวานนี้ ;-) ขอบคุณ!   -  person Pipo    schedule 15.10.2019


คำตอบ (2)


ในกรณีที่คุณต้องการรวมแอตทริบิวต์ที่ไม่เกี่ยวข้องสองรายการ (ไม่ได้มาจากพาเรนต์เดียวกัน) คุณควรกำหนดทั้งสองใหม่:

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

อย่างที่คุณเห็นแล้ว คอมไพลเลอร์จะไม่ยอมให้คุณยกเลิกการกำหนดแอตทริบิวต์ แม้ว่าเป้าหมายคือการรวมเข้ากับแอตทริบิวต์อื่นก็ตาม

person Eric Bezault    schedule 15.10.2019
comment
ขอบคุณเอริค! ในกรณีเปลี่ยนชื่อด้วย? มันเป็นกรณีของฉัน! ขอบคุณคุณช่วยฉันประหยัดเวลาได้มาก! - person Pipo; 15.10.2019

ไม่มีเหตุผลที่จะยกเลิกการกำหนดคุณสมบัติที่จะรวมเข้ากับเวอร์ชันเดียวกันที่มาจากเส้นทางการสืบทอดที่แตกต่างกัน ในตัวอย่าง แอ็ตทริบิวต์ serial จะไม่เปลี่ยนแปลงใน B, C และ D ดังนั้น การสืบทอดจาก B และ C โดยไม่มีการปรับเปลี่ยนใดๆ จึงเป็นเรื่องปกติ:

class D inherit
    B
    C
end
person Alexander Kogtenkov    schedule 15.10.2019
comment
ขออภัย ฉันคิดว่าคำถามของฉันไม่ชัดเจน ฉันแก้ไขแล้ว หวังว่าฉันจะมากกว่านี้ - person Pipo; 15.10.2019
comment
@Pipo คำตอบยังคงเหมือนเดิม: เพียงแค่เก็บแอตทริบิวต์ไว้ภายใต้ชื่อเดียวกันมันจะถูกรวมเข้าเป็นอันหนึ่งโดยไม่มีข้อผิดพลาด - person Alexander Kogtenkov; 15.10.2019
comment
เอริคให้เหตุผลกับฉัน ตัวอย่างของฉันยังไม่สมบูรณ์เมื่อฉันเปลี่ยนชื่อแอตทริบิวต์เป็นคลาส B! การเปลี่ยนชื่อเป็นอนุกรมอีกครั้งเป็น D และการกำหนดใหม่ทำให้ฉันมีวิธีแก้ปัญหา! - person Pipo; 15.10.2019
comment
@Pipo ฉันขอแนะนำให้แก้ไขคำถามเพื่อสะท้อนถึงปัญหาที่คุณกำลังเผชิญ คำตอบของฉันกล่าวถึงปัญหาที่แตกต่างไปจากเดิมอย่างสิ้นเชิงซึ่งระบุไว้ในคำถามเดิม - person Alexander Kogtenkov; 16.10.2019
comment
ใช่ แต่คุณจะต้องแก้ไขคำตอบของคุณ ดังนั้นฉันไม่อยากให้คุณต้องแก้ไขคำตอบทั้งหมด นั่นคือเหตุผลที่ฉันไม่ต้องการแก้ไข - person Pipo; 16.10.2019