Partage
  • Partager sur Facebook
  • Partager sur Twitter

Probleme class abstract

contexte propiétés

    28 janvier 2021 à 22:36:21

    Bonjour, j'utilise une API avec deux class  TSM.BoltArray et  TSM.BoltCircle qui hérite d'une class abstrac  TSM.BoltGroup, mais je n'accede pas au propriété commune 

                       if (UFI.BLS[iB].tyForme == "CARTESIEN")
                        {
                            TSM.BoltArray B = new TSM.BoltArray();                     
                            ...........

                        }

                        if (UFI.BLS[iB].tyForme == "POLAIRE")
                        {
                            TSM.BoltCircle B = new TSM.BoltCircle();

                            ...........
                        }

                        B.PartToBeBolted = cp;     <--  B inexistant dans ce contexte

    Quel serait la méthode sans etre obligé de remettre  "B.PartToBeBolted = cp" dans les 2 conditions if


                       

    -
    Edité par VincentSch2 28 janvier 2021 à 22:38:30

    • Partager sur Facebook
    • Partager sur Twitter
      29 janvier 2021 à 1:56:00

      Comme vous définissez "B" comme des variables locales dans les "if", la variable "B" de votre dernière ligne n'est ni l'une ni l'autre.

      TSM.BoltGroup B = (UFI.BLS[iB].tyForme == "CARTESIEN") ? new TSM.BoltArray() : ((UFI.BLS[iB].tyForme == "CARTESIEN") ? new TSM.BoltCircle() : null);
      
      B.PartToBeBolted = cp;
      



      • Partager sur Facebook
      • Partager sur Twitter
      Je recherche un CDI/CDD/mission freelance comme Architecte Logiciel/ Expert Technique sur technologies Microsoft.
        29 janvier 2021 à 10:07:41

        En insérant votre déclaration J'obtiens  message ci-dessous


        Erreur    CS0173    Impossible de déterminer le type d'expression conditionnelle, car il n'existe pas de conversion implicite entre 'Tekla.Structures.Model.BoltArray' et 'Tekla.Structures.Model.BoltCircle'  

        ligne que j'ai inséré:

         TSM.BoltGroup B = (UFI.BLS[iB].tyForme == "CARTESIEN") ? new TSM.BoltArray() : (  (UFI.BLS[iB].tyForme == "POLAIRE") ? new TSM.BoltCircle() : null  );

        -
        Edité par VincentSch2 29 janvier 2021 à 10:55:12

        • Partager sur Facebook
        • Partager sur Twitter
          29 janvier 2021 à 10:22:25

          Il est pas frais mon code ???
          • Partager sur Facebook
          • Partager sur Twitter
          Je recherche un CDI/CDD/mission freelance comme Architecte Logiciel/ Expert Technique sur technologies Microsoft.
            29 janvier 2021 à 10:58:30

            désolé j'ai répondu trop vite et modifié mon message
            • Partager sur Facebook
            • Partager sur Twitter
              29 janvier 2021 à 14:39:00

              Rien que quelques casts ne se sauraient régler :

              TSM.BoltGroup B = (UFI.BLS[iB].tyForme == "CARTESIEN") ? (TSM.BoltGroup)new TSM.BoltArray() : (  (UFI.BLS[iB].tyForme == "POLAIRE") ? (TSM.BoltGroup)new TSM.BoltCircle() : null  );
              

              Mais comme le code commence à être peu lisible, c'est le moment de sortir une petite méthode :

              private TSM.BoltGroup BoltGroupFactory(){
                  if(UFI.BLS[iB].tyForme == "CARTESIEN") return new TSM.BoltArray();
              
                  if(UFI.BLS[iB].tyForme == "POLAIRE") return new TSM.BoltCircle();
              
                  retrurn null;
              
              }
              
              TSM.BoltGroup B = BoltGroupFactory();



              -
              Edité par bacelar 29 janvier 2021 à 14:39:26

              • Partager sur Facebook
              • Partager sur Twitter
              Je recherche un CDI/CDD/mission freelance comme Architecte Logiciel/ Expert Technique sur technologies Microsoft.
                29 janvier 2021 à 20:46:25

                Impec, tout fonctionne, j'ai refait une variable a l’intérieur des "if"avec Cast pour accéder au propriété des "enfants"

                TSM.BoltArray BB = (TSM.BoltArray)B;

                était ce la bonne méthode ?

                • Partager sur Facebook
                • Partager sur Twitter
                  29 janvier 2021 à 23:47:17

                  Les Cast, c'est à utiliser avec parcimonie.

                  Pour un Design Pattern de création, ça passe ; mais dans le cadre que je devine, je crains que cela ne fait que cacher des erreurs de conceptions plus en amont.

                  Si les "if" dont vous parlez sont dans la méthode de "factory", vous n'avez pas besoin de cast.

                  • Partager sur Facebook
                  • Partager sur Twitter
                  Je recherche un CDI/CDD/mission freelance comme Architecte Logiciel/ Expert Technique sur technologies Microsoft.
                    30 janvier 2021 à 4:27:58

                    Non les "if" sont ceux indiqué dans mon premier message. Avec vos indication le code devient (j'utilise la version déclaration en une seule ligne)

                    static public void Create_Platine(VS_CM.UFI.UFI_PLATINE UFI)
                    {
                    TSM.BoltGroup B = (UFI.BLS[iB].tyForme == "CARTESIEN") ? (TSM.BoltGroup)new TSM.BoltArray() : ((UFI.BLS[iB].tyForme == ...
                       if (UFI.BLS[iB].tyForme == "CARTESIEN")
                       {
                            TSM.BoltArray BB = (TSM.BoltArray)B;
                            BB.AddBoltDistX(v);  //<-- propriété classe enfant accessible
                            ...
                    ... } if (UFI.BLS[iB].tyForme == "POLAIRE") { TSM.BoltCircle BB = (TSM.BoltCircle)B; BB.Diameter = UFI.BLS[iB].Lx[i]*2; //<-- propriété classe enfant accessible ...
                    ...
                    }

                    B.PartToBeBolted = cp; //<-- propriété classe parent accessible
                    ...
                    ...
                    }

                    C'est vrai que ça complique un peu mais ça fonctionne, merci pour les info




                    -
                    Edité par VincentSch2 30 janvier 2021 à 4:38:12

                    • Partager sur Facebook
                    • Partager sur Twitter

                    Probleme class abstract

                    × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                    × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                    • Editeur
                    • Markdown