2016-11-19 14 views

ответ

2

x: expanded A_CLASS - устаревший синтаксис. Он больше не поддерживается.

Однако expanded может использоваться в определении класса. В этом случае, как вы указали, невозможно иметь как отложенный, так и расширенный класс.

В качестве простого правила, можно определить класс только с одним из следующего списка: expanded, deferred, separate, frozen.

Если вы хотите «расширить» уже существующую реализацию, вам просто нужно создать расширенный наследник этого класса. Взгляните на библиотеку ядра Эйфеля, вы можете найти примеры этого (например, INTEGER_32 - расширенный класс - наследуется от INTEGER_32_REF)

+0

* "' x: расширенный A_CLASS' является устаревшим синтаксисом. Он больше не поддерживается. "* ← Вау, я не имел ни малейшего представления! Спасибо! Кстати, где вы нашли эту информацию? Не могли бы вы разместить ссылку для дальнейшего использования? – g4v3

1

Вы правы. Рассуждения можно перефразировать следующим образом:

  1. тип не соответствует непосредственно к расширенному типу.
  2. Если тип расширен, он соответствует только самому себе. (От 1. Есть больше правил соответствия, но для расширенных типов они могут включать только общие параметры не более.)
  3. Объект определенного типа может использоваться только в том случае, если он правильно установлен.
  4. Сущность расширенного типа может использоваться только в том случае, если она создается экземпляром объекта того же типа. (От 2 и 3.)
  5. Отложенный тип не может использоваться для создания экземпляра.
  6. Нельзя использовать объект отложенного расширенного типа. (От 4 и 5.)

Таким образом, хотя технически можно было бы разрешить объявление объектов отложенного расширенного типа, они не могли использоваться.

Как правильно указано в другом ответе, в современном Эйфеле, только один знак класса может использоваться для указания его статуса, и поэтому синтаксически невозможно объявить отложенный расширенный класс или тип. Однако даже это было разрешено, это было бы бесполезно.

EDIT:

Есть два вида соответствия: прямой и вообще. Прямое соответствие отражает отношения между родителями и дочерними элементами: нет правил транзитивности или рефлексивности, специального правила для типа NONE и т. Д. В основном говорится, что если класс C наследует от класса P, то тип C соответствует типу P при определенных условиях.Условия исключают случай, когда расширение C.

Общее соответствие использует прямое соответствие как один из базовых корпусов вместе с некоторыми другими, например. правило рефлексивности "a тип соответствует самому себе". Поэтому правило «нет типа напрямую соответствует расширенному типу» просто означает, что ссылки наследования не имеют значения для расширенных типов. Но из-за правила рефлексивности расширенный тип по-прежнему соответствует самому себе.

Все эти детали за примечанием «От 1». Более подробную информацию можно найти в разделе Standard ECMA-367 (раздел 8.14).

+0

Представьте себе классы 'P' (родительский класс) и' C' (дочерний класс), где 'C' наследует от' P': – g4v3

+0

Если 'P' и' C' не являются расширенными классами, тогда тип C соответствует типу P , но не наоборот. Но если «P» или «C» (или оба) были расширены, ни тип C не соответствовал P ни наоборот, потому что * «Тип не соответствует непосредственно расширенному типу». *. – g4v3

+0

То, что я хочу обсудить, это № 2: * «Если тип расширен, он соответствует только самому себе. (** От 1. ** Существует больше правил соответствия, но для расширенных типов они могут включать не более общих параметров.) "*. Почему «от 1»? Как это может быть логически обоснованным? № 1 говорит нам, что * «Тип не соответствует непосредственно расширенному типу». *, Но соответствие типа не работает в обоих направлениях: если тип C соответствует типу P, это не означает, что тип P соответствует типу C. Следовательно, * «От 1» * * должно быть неправильно, не согласны ли вы? Или это имеет какое-то отношение к использованию слова «прямо» * в № 1? Что это значит? – g4v3