2010-09-15 25 views
0

J'ai une classe appelée Resource, elle est héritée par une classe appelée ResourceMetasans retenir transtypage ascendant référence à un type dérivé

Je dois transtyper ResourceMeta-Resource sans penser qu'il est encore un type de ResourceMeta. Lorsque j'essaie de sauvegarder mon objet à l'aide d'un framework d'entité, il se plaindra des mappings qui n'existent pas, à juste titre, car il essayera d'enregistrer ResourceMeta plutôt que Resource.

J'ai essayé (Resource)resourceMeta mais cela conserve toujours le type de ResourceMeta limite juste les propriétés disponibles à Resource.

+0

En supposant que Resource est une super-classe de ResourceMeta (class ResourceMeta: Resource), la conversion de ResourceMeta en Resource serait upcasting et non downcasting. – TheFogger

+0

Vous avez raison, désolé pour la confusion. – Tablet

Répondre

0

Pas possible dans des mots simples, vous devez créer une nouvelle instance de ressources puis retourner

2

Ce n'est pas possible, vous ne pouvez pas changer le type réel d'un objet.

Pour obtenir un objet Ressource à partir d'un objet ResourceMeta, vous devez créer un nouvel objet Ressource à l'aide des données de l'objet ResourceMeta.

+0

Je pensais seulement que c'était possible à cause du point 3 dans http://stackoverflow.com/questions/2458025/how-to-properly-downcast-in-c-with-a-swig-generated-interface mais je ne sais pas semble avoir la méthode getCPtr – Tablet

+0

@ Shahin: Oui, il est possible de pirater un objet pour penser que c'est un objet différent, mais cela peut facilement exploser. Par exemple, le garbage collector déplace l'objet en mémoire, et s'il déplace un objet en pensant qu'il s'agit d'un type différent, il peut corrompre d'autres objets ou la gestion de la mémoire elle-même. – Guffa

+0

Ah, pas quelque chose que je suis prêt à risquer alors ... est-ce possible en sérialisant comme l'objet désiré et la dé-sérialisation? – Tablet

0

est l'héritage de la représentation correcte de l'association entre les instances ResourceMeta et Resource. Si ce n'est pas le cas, vous pouvez privilégier la composition au lieu de l'héritage et ainsi, lorsque vous voulez enregistrer l'instance de ressource, vous pouvez simplement faire resourceMetaInstance.Resource.