как объединить атрибут в множественном наследовании

Многократно наследуя от 2-х классов, имеющих одного и того же родителя, я попадаю в классический случай наследования 2-х раз одного и того же атрибута. Я хотел бы объединить 2 атрибута в один и попытался сделать это с помощью undefine, но это приводит к ошибке компиляции. Другим решением, которое я вижу, является переименование атрибута одного из обоих родителей, но, как я понимаю, каждый экземпляр моего класса 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