Как правильно расширить класс STRING в Eiffel

Я только что получил старый образец ACCOUNT и написал код с типом владельца STRING:

class
ACCOUNT
create
make
feature
balance: INTEGER
owner: STRING
make
    do
        create owner.make_empty
    end
minimum_balance: INTEGER = 1000
open (who: STRING)
    do
        owner := who
    end

Код приложения:

acc: ACCOUNT
make
    do
        create acc.make
        acc.open ("Jill")
        ...

Он скомпилирован и работает. После того, как я хочу изменить тип владельца на ЧЕЛОВЕКА

owner: PERSON
...
open (who: PERSON)
    do
        owner := who
    end

и я создал класс PERSON как расширение класса STRING:

class
PERSON
inherit
STRING
end

Я считаю, что это может работать на любом языке, но, похоже, не на Эйфеле. Код не компилируется с ошибками VGCC(6) и VEVI. Любые идеи?


person SeregASM    schedule 07.08.2017    source источник
comment
Вы должны предоставить фактический вывод ошибки.   -  person Berend de Boer    schedule 09.08.2017


Ответы (1)


Я бы не рекомендовал делать человека потомком строки по нескольким причинам:

  • Это неправильно моделирует внешний мир: у человека есть имя, это не имя. В частности, допускается смена имени (например, после замужества), но это не меняет человека.

  • Это раскрывает особенности строки, которые не связаны с человеком. Например, что должно возвращать функцию split?

  • Это вводит ненужные зависимости между человеком и строкой.

Последний пункт имеет решающее значение для понимания того, почему вы получаете ошибки времени компиляции: потомок должен выполнять инварианты предка. Одним из инвариантов является то, что атрибуты прикрепленных типов должны быть инициализированы в процедуре создания. В вашем коде нет процедуры создания, которая инициализирует атрибуты, поэтому ошибка VEVI для процедуры создания по умолчанию default_create, которая пуста, если не переопределена.

Точно так же, когда вы создаете объект человека, необходимо вызвать процедуру создания. Но в классе PERSON процедура создания не указана, поэтому компилятор сообщает VGCC(6) - либо соответствующая процедура создания не указана в инструкции создания, либо указанная функция не является процедурой создания.

person Alexander Kogtenkov    schedule 15.08.2017