O que causa MOVE_CAST_ERROR quando down-lançando um objeto de referência em ABAP?
Pergunta
Estou criando uma classe que herda de uma classe pai com instanciação protegida. O super classe tem um método estático que fornece uma instância da classe.
O código a seguir faz com que um MOVE_CAST_ERROR
erro de tempo de execução:
data: o_child type ref to zchild.
o_child ?= zparent=>provide_instance( ).
Eu também tentei:
data: o_parent type ref to zparent,
o_child type ref to zchild.
o_parent = zparent=>provide_instance( ).
o_child ?= o_parent.
Eu tenho sucesso down-fundido com outros tipos de objetos no passado - alguém tem uma idéia do que procurar em ZPARENT ou ZCHILD que podem fazer as duas classes são incompatíveis?
Atualmente ZCHILD só tem um método extra, que se adicionado à classe de super iria quebrar a abstração da classe, então eu não sou tão interessado em fazê-lo.
Solução
Eu não fiz qualquer objeto orientada codificação em ABAP. Nem muito programação ABAP. Mas eu acho que este é um cenário oo típico. Então aqui é o meu palpite.
Você não pode converter um objeto para o que não é.
Você criou uma instância da classe pai. Agora, a classe filha tem a propriedade de "myCandy" que a classe pai não tem. Portanto, o seu objeto não tem essa propriedade. E então você lançá-lo para filho. O que os pobres tempo de execução tem que fazer quando você pedir (ou mudança) a propriedade "myCandy"? Ele não pode fazer nada. Por isso, não permitir esse elenco.
O elenco só é possível se o objeto foi instanciado como a criança e, em seguida, ele foi escalado para o objeto pai e, em seguida, volta novamente para o objeto filho. A criança tem tudo o que o pai tem por isso não há problema com este caminho.