Что вызывает MOVE_CAST_ERROR при низведении ссылочного объекта в ABAP? - PullRequest
2 голосов
/ 23 октября 2009

Я создаю класс, который наследуется от родительского класса с защищенной реализацией. Суперкласс имеет статический метод, который предоставляет экземпляр класса.

Следующий код вызывает ошибку во время выполнения MOVE_CAST_ERROR:

data: o_child type ref to zchild.

o_child ?= zparent=>provide_instance( ).

Я также пробовал:

data: o_parent type ref to zparent,
      o_child  type ref to zchild.

o_parent = zparent=>provide_instance( ).
o_child  ?= o_parent.

В прошлом я успешно преуменьшал значение других типов объектов - есть ли у кого-нибудь идеи, что искать в ZPARENT или ZCHILD, которые могут сделать эти два класса несовместимыми?

В настоящее время у ZCHILD есть только один дополнительный метод, который, если его добавить в суперкласс, нарушит абстракцию класса, поэтому я не очень хочу это делать.

1 Ответ

2 голосов
/ 29 октября 2009

Я не делал никакого объектно-ориентированного кодирования в abap. Не слишком много программирования. Но я думаю, что это типичный сценарий. Итак, вот мое предположение.

Нельзя привести объект к тому, чем он не является.
Вы создали экземпляр родительского класса. Теперь у дочернего класса есть свойство «myCandy», которого у родительского класса нет. Таким образом, ваш объект не имеет этого свойства. И тогда вы бросаете это ребенку. Что плохое время выполнения должно делать, когда вы запрашиваете (или изменяете) свойство myCandy? Это ничего не может сделать. Так что это запрещает этот актерский состав.

Приведение возможно, только если объект был создан как дочерний, а затем он был приведен к родительскому объекту, а затем снова к дочернему объекту. У ребенка есть все, что есть у родителя, поэтому с этим путем проблем нет.

...