J'ai cette structure simple: 1 parent et deux différents enfants b> enfants. ChildA objA = new ChildA();
ChildB objB = (ChildB)objA;
8 Réponses :
Ce n'est pas possible car l'objet Ils ont tous deux un parent commun - Supposons que votre Pourquoi voulez-vous prétendre qu'un pour effectuer une conversion appropriée? P> p> obja code> fait référence à pas em> a
CAMTELBB code>. Pour mettre un autre moyen, voici un exemple de ce que vous essayez de faire:
system.Object code> - mais ils " rétablement différentes classes. Que vous attendriez-vous si vous essayez de lire à partir de
y code>? P>
Childb code> est un champ spécifique à ce type - quoi Seriez-vous vous attendre à ce que la valeur de ce champ soit après la coulée
obja code>? p>
enfant code> est en fait un
maille < / code>? Pourriez-vous peut-être ajouter une méthode dans la classe mère qui fait ce que vous voulez? Ajoutez une méthode dans
Enfonda code> comme ceci: p>
Eh bien, pour répondre à certaines de vos questions: mon idée en casting de l'enfant à la petite taille est que les variables communes survivraient et que les variables non attribuées se sont fixées à NULL ou à similaires. Et c'est exactement ce que je voulais, mais en raison de votre réponse, j'ai choisi une méthode de conversion à la place.
@Chau: votre supposition aurait été énormément dangereuse - que si ces variables avaient été nécessaires pour en faire un objet valide? L'approche de conversion devrait être bonne :)
@Jon: Je suis sûr que vous avez parfaitement raison, mais dans mon monde idéal, cela aurait fonctionné juste =)
Pourquoi ne combinez-vous pas les propriétés qui sont partagées entre l'enfant et la pièce à coucher dans une classe à partir de laquelle hériter. De cette façon, vous pourriez Childb Childb = Enfonda comme Subchild; Code> corrigez-moi si je me trompe s'il vous plaît Jon :)
@Peter: Dans ce cas, les pousser juste dans le parent. Oui, c'est une approche préférable.
Vous ne pouvez pas parce que les enfants ne sont pas un enfant (vous ne pouvez éteindre qu'à partir de l'enfant ou de la camarade de parents ou de la conscience du parent à la pièce à coucher à l'encontre ou à l'enfant, il n'y a pas de sidodet en C #) P>
Si vous voulez faire la distribution possible (une entreprise douteuse, mais bien), vous devez mettre en œuvre un opérateur de distribution de l'enfant à la petite enfance. P>
Downcasting ne fonctionne pas non plus. Supposons que vous ayez: parent p = nouveau parent (); Enfant a = (encadré) p; Ou parent p = nouveau enfant (); Childb b = (Childb) P; Vous ne vous attendriez pas à ce que cela fonctionne!
Oui, cela échouerait au moment de l'exécution, mais cela compilerait.
obja est
Qu'est-ce que vous essayez de faire ne fonctionnera pas. p>
Vous ne pouvez utiliser que Case OBJA à sa classe de base (parent) ou à toute interface commune que pourrait mettre en œuvre une enfance et la pièce à coucher. P>
Imaginez, pour un moment, que la pièce a défini une méthode appelée foo. Comment votre instance d'OBJA ferait-elle affaire à quelqu'un qui a appelé FOO? Clairement, cela ne pouvait pas fonctionner. P>
Il n'est pas possible de simplement lancer un objet autre type, même si Thay a un parent, car Thay a peut-être différentes interfaces.
Vous devez mettre en œuvre un opérateur explicite ou implicitif de l'enfant (ou de la pièce à coucher). P> ou p> et après la mise en œuvre des opérateurs de conversation après le code suivant fonctionnera bien: P> var a = new ClassA();
a.ParentProperty = "test";
ClassB b = Parent.Convert<ClassB>(a);
Console.WriteLine(b.ParentProperty); // output is "test"
Merci pour votre explication plus approfondie de Jons Réponse plus générale - Même si vos messages semblent être parallèles =)
encadré code> et
Childb code> sont différents types qui partagent le même parent. Ainsi, vous pouvez traiter des instances des deux
enfant code> et
maille code> comme base,
parent code>, mais comme ils sont des types différents, vous ne pouvez pas en lancer un à L'autre. p>
Comme d'autres disent que l'enfant n'est pas coélie. Si les enfants et B ont les mêmes propriétés / fonctions, vous devriez faire:
public class Parent{} public class Child : Parent{} Child objA = new Child(); Child objB = objA;
Je suis à peu près sûr que j'ai proposé un moyen de simuler cela, ce qui pourrait être utile à un moment donné. À savoir:
Vous pouvez maintenant prendre un CATLidifoBject hériter de cette classe de base et en utilisant le constructeur (lancer le chat à un dictionnaire), génère un chien identique (qui aboie au lieu de miaulé, mais est toujours appelé " Puss "). P>
Inconvénients? Les propriétés prennent beaucoup plus d'espace et beaucoup de sécurité sont déplacées vers l'exécution, sans parler de toute perte de performance qu'il peut y avoir (et il y en aura certainement). Avantages? Si vous avez besoin de traiter temporairement un chat comme un chien, vous pouvez. P> } p> p>
@Chau: Je pense que l'utilisation des enfants / enfants et les classes des parents pourrait être trompeuse. Cela donne une impression que les enfants sont capables parmi les autres. Le fait que vous utilisiez une telle convention de dénomination dans votre exemple pourrait être parce que vous avez la tendance à le supposer. Mais je pourrais avoir tort: p