10
votes

C #: Résolution de l'exception de moulage non valide entre une classe héritée et sa base

J'ai deux classes, nommé post et question. La question est définie comme suit: xxx pré>

Ma classe de questions ne remplace aucun membre de Post, cela exprime simplement quelques autres. P>


Ce que je veux accomplir h2>

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>

Post postToQuestion = new Post();

//Populate the Post...

Question ques = (Question)postToQuestion; //--> this is the error!

//Fill the other parts of the Question.


0 commentaires

5 Réponses :


4
votes

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".

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à.


0 commentaires

23
votes

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;

http://www.codeproject.com /Kb/cs/cshaarp_implicit_opérator.aspx

Edit: En fait, je viens d'essayer de taper une démo pour que vous faisiez l'opérateur implicite: xxx

mais C # mais que c # ne vous laisse pas faire des conversions implicites avec une classe de base.


2 commentaires

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.



6
votes

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: xxx pré>

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> xxx pré>

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);


4 commentaires

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 #.



3
votes

Si vous voulez Changer FORT> Le type, vous devez écrire un code ou parfois vous pouvez sérialiser. La coulée ne change pas le type (sauf si un opérateur personnalisé n'a été écrit).

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);


0 commentaires

0
votes

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
    }
}


0 commentaires