Cast, héritage et surcharge ...

LocalStone Messages postés 514 Date d'inscription mercredi 19 mars 2003 Statut Membre Dernière intervention 1 mars 2009 - 31 mai 2006 à 01:12
Nikoui Messages postés 794 Date d'inscription vendredi 24 septembre 2004 Statut Membre Dernière intervention 19 août 2008 - 31 mai 2006 à 14:50
Bonsoir à tous ...

Alors voilà ... J'ai une classe Matrix qui possède - entre autre - les
propriétés Height et Width, qui correspondent respectivement à la
hauteur et à la largeur d'une matrice. J'ai aussi une classe Vector qui
hérite de la classe Matrix, sachant qu'en fait un vecteur n'est qu'une
simple matrice dont la propriété Height vaut 1.

Du coup, je me suis mis en tête de coder deux opérateurs de cast pour
passer de Matrix à Vector si cela est possible, et de Vector à Matrix,
sachant que cela est également toujours possible. Mais là, le
compilateur me sort que ce n'est pas utile .

Alors que dois-je faire ? Y a-t-il une solution autre que de créer des méthodes statiques telles que ToVector ou ToMatrix ?

Mais ce n'est pas terminé  ! ...
Dans la classe Matrix, j'ai surchargé l'opérateur arthmétique +. Ainsi,
si A et B sont 2 matrices, alors A + B retourne une matrice. Mais le
problème, c'est que si A et B sont 2 vecteurs, alors A + B va retourner
une matrice et non un vecteur, sauf si je recommence à surcharger cet
opérateur dans la classe Vector. Or j'aimerais éviter ça, puisque c'est
justement pour ça que j'ai voulu que Vector hérite de Matrix. Alors
est-il possible d'effectuer une sorte de cast automatique ou quelque
chose comme ça ?

Merci de vos réponses !
LocalStone

23 réponses

Nikoui Messages postés 794 Date d'inscription vendredi 24 septembre 2004 Statut Membre Dernière intervention 19 août 2008 13
31 mai 2006 à 14:26
Est ce que c'est ça que tu veux :

    class Matrix
    {
       // ...
    }

    class Vector
        :Matrix
    {
        public Vector(Matrix m)
        {
           // ..
        }

       // ..
    }

    Matrix m = new Matrix();           
    Vector v = new Vector(m);
0
LocalStone Messages postés 514 Date d'inscription mercredi 19 mars 2003 Statut Membre Dernière intervention 1 mars 2009
31 mai 2006 à 14:32
Bah en quelque sorte, oui, mais ... Euh ... Sauf ton respect ... C'est moche  !
Parce que dans ce cas là, si par exemple la multiplication de la matrice a et de la matrice b donne une matrice de largeur 1 et que l'on le sait ... Alors :
Vector v;
v = (Vector)(a * b);
Bah c'est plus joli à mon gout que :
Vector v;
v = new Vector(a * b);
Mais au pire ... Si tu penses qu'il n'y a pas d'autres solutions, je vais faire ça. Mais c'est dommage. Y a une faille dans le C#, là !
LocalStone
0
Nikoui Messages postés 794 Date d'inscription vendredi 24 septembre 2004 Statut Membre Dernière intervention 19 août 2008 13
31 mai 2006 à 14:50
Ce n'est pas particulierement une faille de C#, ni des autres langages objets d'ailleurs... mais disons que tu cherches à faire du "polymorphisme allez retour", en pouvant convertir librement n'importe quel object "pere" en "fils", et inversement...

Tu as la possibilité de faire des cast explicites entre objets... mais ca ne marche pas pour les objets qui dérivent l'un de l'autre. Ce qui en soit reste assez logique... Un vecteur étant par définition une matrice "spécialisée", tu ne pas dire simplement qu'une matrice est un vecteur... il te faut pour cela un appel de fonction explicite pour "transformer" ta matrice en vecteur (comme l'appel au constructeur, ou n'importe quel autre méthode que tu pourrai utiliser pour faire la même chose)..

Tout ça pour dire que "ça s'explique" et que c'est certainement voulu. Mais je suis d'accord avec toi, à partir du moment ou le langage offre la possibilité de caster une carrotte en voiture, alors autant qu'il offre la possibilité de caster un légume en carrotte ...
0
Rejoignez-nous