как объединить атрибут в мульти-наследование - PullRequest
0 голосов
/ 15 октября 2019

Неоднократно наследуя от 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

Ответы [ 2 ]

1 голос
/ 15 октября 2019

Если вы хотите объединить два несвязанных атрибута (не от одного и того же родителя), вы должны переопределить оба из них:

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

Как вы уже видели, компилятор не позволит вамотменить определение атрибута, даже если цель состоит в том, чтобы объединить его с другим атрибутом.

1 голос
/ 15 октября 2019

Нет причин отменять определение функции, которая будет объединена с той же версией, исходящей из другого пути наследования. В этом примере атрибут serial не изменяется в B, C и D. Следовательно, наследование от B и C без какой-либо адаптации возможно:

class D inherit
    B
    C
end
...