7
votes

C # héritage votant un enfant à un autre

J'ai cette structure simple: 1 parent et deux différents enfants b> enfants.

ChildA objA = new ChildA();

ChildB objB = (ChildB)objA;


1 commentaires

@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


8 Réponses :


13
votes

Ce n'est pas possible car l'objet obja fait référence à pas a CAMTELBB . Pour mettre un autre moyen, voici un exemple de ce que vous essayez de faire: xxx

Ils ont tous deux un parent commun - system.Object - mais ils " rétablement différentes classes. Que vous attendriez-vous si vous essayez de lire à partir de y ?

Supposons que votre Childb 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 ?

Pourquoi voulez-vous prétendre qu'un enfant 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 comme ceci: xxx

pour effectuer une conversion appropriée?


5 commentaires

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



2
votes

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

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.


2 commentaires

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.



0
votes

obja est pas de type maquette, même si les deux sont "enfants" de la classe parent.


0 commentaires

0
votes

Qu'est-ce que vous essayez de faire ne fonctionnera pas.

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.

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.


0 commentaires

4
votes

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

ou p> xxx pré>

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"


1 commentaires

Merci pour votre explication plus approfondie de Jons Réponse plus générale - Même si vos messages semblent être parallèles =)



0
votes

encadré et Childb sont différents types qui partagent le même parent. Ainsi, vous pouvez traiter des instances des deux enfant et maille comme base, parent , mais comme ils sont des types différents, vous ne pouvez pas en lancer un à L'autre.


0 commentaires

0
votes

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;


0 commentaires

0
votes

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:

  • hériter du dictionnaire, ou du cahictionnaire et mettez-le en œuvre si vous avez besoin d'une autre héritage de base
  • Propriétés du magasin en deux emplacements - le dictionnaire et un champ réel
  • Gardez un troisième champ booléen qui signale si le domaine réel a été fixé ou non
  • Si le champ réel a été défini, prenez le champ réel
  • Si ce n'est pas le cas, prenez la valeur du dictionnaire (ainsi que l'attribution au champ réel, et signalez-vous)
  • Si aucune valeur de dictionnaire, agissez comme si la propriété n'existe pas
  • Ajouter un constructeur qui prend un dictionnaire et la popule avec les valeurs du dictionnaire

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

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

    }


0 commentaires