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

[Résolu]
Signaler
Messages postés
714
Date d'inscription
mardi 22 avril 2003
Statut
Membre
Dernière intervention
19 janvier 2017
-
Messages postés
714
Date d'inscription
mardi 22 avril 2003
Statut
Membre
Dernière intervention
19 janvier 2017
-
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

Messages postés
111
Date d'inscription
vendredi 24 septembre 2004
Statut
Membre
Dernière intervention
27 avril 2010

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é ^^
Messages postés
326
Date d'inscription
vendredi 23 décembre 2005
Statut
Membre
Dernière intervention
8 février 2011
17
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.
Messages postés
3246
Date d'inscription
lundi 25 avril 2005
Statut
Modérateur
Dernière intervention
27 octobre 2012
41
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 ) );
Messages postés
714
Date d'inscription
mardi 22 avril 2003
Statut
Membre
Dernière intervention
19 janvier 2017

@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
Messages postés
18
Date d'inscription
lundi 11 janvier 2010
Statut
Membre
Dernière intervention
21 mai 2010

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?
Messages postés
326
Date d'inscription
vendredi 23 décembre 2005
Statut
Membre
Dernière intervention
8 février 2011
17
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.
Messages postés
714
Date d'inscription
mardi 22 avril 2003
Statut
Membre
Dernière intervention
19 janvier 2017

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