[C# 2.0] [Architecture] Héritage Int/Float

Résolu
scoubidou944 Messages postés 714 Date d'inscription mardi 22 avril 2003 Statut Membre Dernière intervention 19 janvier 2017 - 26 avril 2010 à 22:58
scoubidou944 Messages postés 714 Date d'inscription mardi 22 avril 2003 Statut Membre Dernière intervention 19 janvier 2017 - 27 avril 2010 à 18:00
Glop, glop,

je profite d'un peu de temps pour reprendre le codage et contrairement au vélo, on oublie vite :/

J'ai une classe de base SensorValueThreshold.
De cette dernière, j'ai dérivé 2 classes : SensorFloat et SensorInt

Cela donne une implémentation de ce type :
public abstract class SensorValueThreshold
    {
        private object m_WarningThreshold;
        private object m_ErrorThreshold;
        private object m_Min;
        private object m_Max;

        public SensorValueThreshold()
        {            
        }

        #region Properties
        public object WarningThreshold
        {
            get { return m_WarningThreshold; }
            set { m_WarningThreshold = value; }
        }
        public object ErrorThreshold
        {
            get { return m_ErrorThreshold; }
            set { m_ErrorThreshold = value; }
        }
        public object Min
        {
            get { return m_Min; }
            set { m_Min = value; }
        }
        public object Max
        {
            get { return m_Max; }
            set { m_Max = value; }
        }
        #endregion
    }


Le problème c'est que si on initialise la classé dérivée (SensorFloat) avec un code :
SensorFloat f;
f.Min = 40;
le type de m_Min sera (int) et non pas (float).
Et dans le code plus loin, on se tape des exceptions puisque les types ne correspondent pas.

Une idée de comment corriger ça ?

Merci.
Vince

7 réponses

cs_kurky Messages postés 111 Date d'inscription vendredi 24 septembre 2004 Statut Membre Dernière intervention 27 avril 2010
27 avril 2010 à 17:11
Comme l'a dit GG29 il te faudrait passer par les génériques.

Ta classe de base deviendrait donc :

public abstract class SensorValueThreshold<T>
    {
        private T m_WarningThreshold;
        private T m_ErrorThreshold;
        private T m_Min;
        private T m_Max;

        public SensorValueThreshold()
        {            
        }

        #region Properties
        public T WarningThreshold
        {
            get { return m_WarningThreshold; }
            set { m_WarningThreshold = value; }
        }
        public T ErrorThreshold
        {
            get { return m_ErrorThreshold; }
            set { m_ErrorThreshold = value; }
        }
        public T Min
        {
            get { return m_Min; }
            set { m_Min = value; }
        }
        public T Max
        {
            get { return m_Max; }
            set { m_Max = value; }
        }
        #endregion
    }



Et tes classes dérivées :

public class SensorFloat : SensorValueThreshold<float>
{
...
}


Ainsi quand tu accederas a tes propriétés elles seront toujours typées int ou float enfin suivant le type de ton dérivé ^^
3
cs_GG29 Messages postés 326 Date d'inscription vendredi 23 décembre 2005 Statut Membre Dernière intervention 8 février 2011 17
26 avril 2010 à 23:39
Peut-être que les génériques pourront t'aider.


---
mon blog
Généralement le bug se situe entre le clavier et la chaise.
Le temps est une "chose" introuvable dont l'existence ne fait aucun doute.
0
Lutinore Messages postés 3246 Date d'inscription lundi 25 avril 2005 Statut Membre Dernière intervention 27 octobre 2012 41
26 avril 2010 à 23:46
Salut,

object f = 10.0f;
MessageBox.Show( "f is float : " + ( f is float ) );
object d = ( double )10;
MessageBox.Show( "d is double : " + ( d is double ) );
0
scoubidou944 Messages postés 714 Date d'inscription mardi 22 avril 2003 Statut Membre Dernière intervention 19 janvier 2017
27 avril 2010 à 08:17
@GG29 : oui c'est ce que je me suis dit après. J'ai trop absué de .NET 1 pour avoir le réflexe ;p

@Lutinore : oui mais ça n'empêche pas l'erreur d'initialisation (car le développeur est si étourdit)

----------------------------
C++ forever
C# amateur
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
patatasux Messages postés 18 Date d'inscription lundi 11 janvier 2010 Statut Membre Dernière intervention 21 mai 2010
27 avril 2010 à 16:10
tu px pas override tes deux min max, et a la place des Object, dans l'un tu mets int, et dans l'autre float?
0
cs_GG29 Messages postés 326 Date d'inscription vendredi 23 décembre 2005 Statut Membre Dernière intervention 8 février 2011 17
27 avril 2010 à 16:20
Quand tu overrides tu gardes la même signature. Tu ne peux donc pas transformer object en int ou float.


---
mon blog
Généralement le bug se situe entre le clavier et la chaise.
Le temps est une "chose" introuvable dont l'existence ne fait aucun doute.
0
scoubidou944 Messages postés 714 Date d'inscription mardi 22 avril 2003 Statut Membre Dernière intervention 19 janvier 2017
27 avril 2010 à 18:00
Oui en effet, j'ai du faire comme ça.
(je me dis qu'en .NET1 ça aurait été le plan galère ;p)

----------------------------
C++ forever
C# amateur
0
Rejoignez-nous