8
votes

Type de base converti / moulé au type dérivé

Je prolonge que la classe Framework existante en dérive. Comment convertir un objet de type de base au type dérivé? XXX

Je comprends que cela se produit comme j'essaie de lancer un type de base à un type dérivé et si le type dérivé a des propriétés supplémentaires, Ensuite, la mémoire n'est pas allouée. Lorsque je ajoute les propriétés supplémentaires, je m'en fiche si elles sont initialisées à NULL.

Comment puis-je faire cela sans effectuer une copie manuelle?


4 commentaires

Au lieu d'étendre le type, pouvez-vous simplement créer une méthode d'extension?


C'est une bonne idée. Avec des méthodes d'extension, je peux joindre de nouvelles méthodes. Je ne peux pas vraiment ajouter des propriétés / variables supplémentaires au type.


Cela ressemble à beaucoup de travail pour éviter d'écrire un constructeur de copie simple. Je sais dans beaucoup de cas qui n'est pas possible, mais cela semble être une solution possible dans ce cas.


@overSlacked - Comment le constructeur de copie serait-il l'air? Pouvez-vous me donner des pointeurs?


6 Réponses :


1
votes

Que diriez-vous: xxx

et vous devez également créer un constructeur dans votre myResults Classe: < Pré> xxx

Qu'est-ce qui signifie exactement "rien ici"?

edit xxx

Il ne jette pas l'exception, mais si cela vous sera utile - cela dépend de ce que vous Voudrais faire plus loin ...


6 commentaires

"Rien ici" comme dans la littéralement rien. Pour l'instant, j'ai hérité du type de base avec l'intention d'ajouter de nouvelles propriétés à l'avenir.


Je vois. J'ai édité ma réponse - veuillez vérifier une nouvelle solution.


@GACEK - L'utilisation du mot clé n'a pas lancé une exception mais que l'objet myResult est null, bien que le CallframeworkMethod renvoie un objet non nul.


Concernant votre édition: Si CallFrameworkMethod renvoie un Résultats plutôt qu'un myResults , alors votre modification sera simplement définir résultats à null. Le casting échoue toujours, mais l'opérateur comme l'indique en renvoyant null plutôt que de jeter une exception.


Y a-t-il dans la classe de résultats d'un constructeur, qui permet de créer un objet basant sur d'autres? Quelque chose comme résultats (résultats de référence) ? Si tel est le cas, vous pouvez mettre en œuvre un constructeur similaire dans votre classe (en dérivant le constructeur d'origine), puis appelez-le comme celui-ci: var résultats = Nouveaux myRésults (CallFrameworkMethod ());


Malheureusement non. J'ai examiné la mise en œuvre des résultats par le cadre et cela n'a pas cela.



12
votes

Vous ne pouvez pas. Si résultats ne se réfère pas à un myResults (par exemple, si CallFrameworkMethod renvoie une base résultats instance), puis casting Ne le fera pas, vous n'aurez pas besoin de créer un nouveau myResults , en fonction du non- myRésults . La coulée consiste à changer le type de compilation de la référence , pas sur la modification du type concret de l'objet référencé.

Vous pouvez utiliser des outils tels que réflexion ou automapper pour vous aider à l'initialisation du nouveau myResults objet - mais un nouvel objet myResults Il doit y avoir, parce que vous ne pouvez pas Dites à une base résultats d'objet pour devenir un myResults objet.


2 commentaires

Cela a-t-il à voir avec la variance / la covariance? Je suis sur .NET 4.0 et je sais qu'ils ont fait quelque chose pour la variance / la covariance. Une idée?


Non, la variance C # 4.0 est à voir lorsque vous utilisez des types de base / dérivés comme paramètres de type pour les interfaces génériques ou les délégués; Et vous n'avez aucune interface générique ni délégués ici. Votre problème est plus fondamental: il s'agit du type concret de l'objet. Un objet de résultats simplement n'est pas une instance du type myRésults. Si CallFrameworkMethod renvoie des résultats (réels), les références à cet objet ne peuvent pas être munées sur myResults car l'objet n'est pas myRésults. Le seul moyen de changer CallframeworkMethod pour renvoyer des myRésultats ou créer des myRésultats neufs.



0
votes
Results results = new MyResults();
   ...

return (MyResults)results;
should work. If not, then the problem is somewhere alse.

2 commentaires

Non, parce qu'il l'écrase ensuite avec la valeur de retour de CallframeworkMethod - qui retourne probablement autre chose que les myresults, ou la distribution réussirait.


Il fait une instance de la classe myResult puis appelle la méthode CallframeworkMethod qui attribue à l'objet de résultats d'une autre instance qui ne peut pas être coulée.



1
votes

Non, vous ne pouvez pas éviter de copier le contenu dans une instance du type dérivé. Eh bien, si vous pouvez changer CallFrameworkMethod pour être une méthode générique et MyResults possède un constructeur zéro argument, puis Callframeworkmethod pourrait créer une nouvelle instance de votre type dérivé directement, puis utilisez uniquement les membres du type parent.

Mais vous devrez probablement finir de copier sur un nouvel objet. N'oubliez pas que ce code de copie peut certainement être réutilisé dans une autre méthode, vous n'avez pas à vous réécrire partout où vous en avez besoin.


2 commentaires

Comment le constructeur de copie serait-il l'air? Pouvez-vous me donner des pointeurs?


C # n'a pas de "Copie Constructeurs". Mais vous pouvez certainement écrire une méthode réutilisable qui accepte la classe de base et renvoie une instance de la classe dérivée, avec tous les membres de la classe de base copiés. Ou demandez-vous de l'idée générique?



1
votes

Comme les réponses précédentes ont dit, vous devez instancier une nouvelle instance de myRésultats, puis copiez les propriétés de votre objet de résultats. Vous avez demandé quel était un "constructeur de copie" - il s'agit simplement d'un constructeur qui prend un objet et l'utilise pour remplir l'objet en cours de construction. Par exemple: xxx

Un constructeur de copie est généralement plus pratique, lisible et réutilisable que d'utiliser le code comme celui-ci: xxx

s'il y a beaucoup des propriétés et / ou vous apportez beaucoup de modifications à la classe que vous pouvez utiliser la réflexion (par exemple, C # à l'aide de la réflexion pour copier les propriétés de la classe de base ) ou un outil tel que MODAPPER ( http: // automapper.codeplex.com ) Pour copier les propriétés. Mais souvent cela peut être surchargé.


0 commentaires

0
votes

a diminué d'un objet dans sa classe dérivée (ES), l'objet doit être né em> dans sa classe dérivée. Par exemple: J'ai une classe simple appelée forme Voici le code de la classe de forme xxx pré>

et j'ai une autre classe nommée cercle comme suit: p> xxx pré>

maintenant si je crée un Objet de super classe comme p> xxx pré>

et si vous essayez de descendre ce NOSHAPE code> objet à Cercle code> objet comme celui-ci p >

Circle derivedCircle = (Circle) upcastedObject;


0 commentaires