J'ai deux classes, nommé post et question. La question est définie comme suit: Ma classe de questions ne remplace aucun membre de Post, cela exprime simplement quelques autres. P> J'ai un objet de type post, dont les membres sont peuplés. Maintenant, je veux le convertir en une question, de sorte que je puisse ajouter des valeurs pour ces quelques autres membres. P> Ceci est mon code actuel, en utilisant une conversion de moulage explicite: P>
Ce que je veux accomplir h2>
Post postToQuestion = new Post();
//Populate the Post...
Question ques = (Question)postToQuestion; //--> this is the error!
//Fill the other parts of the Question.
5 Réponses :
Faire une distribution ne change pas l'objet que vous coulez - il ne peut donc pas ajouter les membres "Question" manquants à votre objet "Post". Je crains que vous n'ayez simplement pas besoin de créer une nouvelle "question" et de copier les membres qui vous intéressent de "post" à "question". P>
Notez que faire la diffusion de l'autre sens, de la "question" à "post", fonctionnerait bien, car vous pouvez traiter une question comme un poste sans avoir à le changer - tous les champs obligatoires sont déjà là. p>
Le problème est que vous ne pouvez pas lancer de parent à l'enfant. Vous pouvez créer un constructeur pour la classe enfant qui prend la classe parent comme param: Questions questions = nouvelle question (mypost);
Vous pouvez également utiliser l'opérateur implicite pour le rendre simple à faire cela: Questions questions = mypost; p>
http://www.codeproject.com /Kb/cs/cshaarp_implicit_opérator.aspx P>
Edit:
En fait, je viens d'essayer de taper une démo pour que vous faisiez l'opérateur implicite: p> mais C # mais que c # ne vous laisse pas faire des conversions implicites avec une classe de base. P > p>
Je viens d'essayer d'utiliser votre exemple d'opérateur implicite, mais je reçois une erreur de compilateur CS0553: "Les conversions définies par l'utilisateur aux valeurs d'une classe de base ne sont pas autorisées".
Ouais, j'ai remarqué que juste après que je l'ai posté. Au bas de mon poste, il y a un lien vers un article qui explique le même problème que vous avez et montre un exemple de la façon dont il l'a résolue.
La poste n'est pas une question à ce stade et le CLR se plaint à juste titre. Vous pouvez mettre la question à poster mais pas visa-versa. Maintenant, si vous aviez une référence de haut niveau à un poste que vous saviez EM> était une question, vous pourriez dire que ceci: mais même c'est Un code odeur a >. P> Mais je pense que ce que vous essayez d'accomplir peut être atteint sans casting de classe, ni peut-être sans héritage du tout. Suivant la vénérable "Favoriser l'encapsulation sur héritage" principe, pourquoi pas seulement envelopper le Post objet dans votre objet question avec quelque chose comme: p> supposant que vous avez défini les propriétés des membres pertinents de la publication, au lieu de p> Question ques = new Question(post);
Cette héritage de l'interface Plus ferait cette implémentation la plus simple.
-1 Pour utiliser SetBlah Style Java, c'est ce que les propriétés sont pour en .NET
En outre, c'est "est", pas "instance de"
Désolé, Java sur le cerveau et les Netbeans sont proches de la main - les principes sont identiques. J'ai corrigé pour C #.
Si vous voulez L'option la plus simple em> est de le créer comme type de droite en premier lieu: P> Question question = Serializer.ChangeType<Post,Question>(post);
Pourriez-vous faire ceci:
public Question(Post P) : base(p) {...} class Post { public Post(Post P) { populate(P.ID); } void populate(int ID) { // load from DB, or however it happens } }