Generics et Math.Abs()

Signaler
-
Messages postés
1860
Date d'inscription
lundi 28 novembre 2005
Statut
Modérateur
Dernière intervention
14 février 2015
-
Bonjour à tous,

je cherche a créer une fonction Math.Abs() generique pour tout les types possibles a savoir les types primitifs(int,double)(sa ce n'est pas un soucis vu que Math.Abs le fait déjà) mais aussi pour des types que j'ai créer comme MyNumber ou des type encore inconnu creation à venir (c'est la que sa coince) comment faire pour créer cette classe generique.

Si quelqu'un à une idée qu'il me la fasse parvenir.

Merci
A voir également:

2 réponses

Messages postés
239
Date d'inscription
lundi 5 décembre 2005
Statut
Membre
Dernière intervention
27 août 2012
5
Bonjour,

comme tu le cites dans ton titre, utilises les génériques et l'héritage avec une signature telle que
public abstract int Abs<T>(<T> value);


Ensuite tu implémentes la classe abstraite pour chacun des types possibles.
Messages postés
1860
Date d'inscription
lundi 28 novembre 2005
Statut
Modérateur
Dernière intervention
14 février 2015
42
Salut

Deux solutions
- Soit tu crées autant de méthodes Abs que tu as de types (quitte à tout mettre dans la même méthode et faire un switch sur le type de l'objet transmis en paramètre) - méthode pas très propre, pas très pratique
- Soit tu crées une interface te permettant de calculer la valeur absolue (soit en mettant une méthode Abs dans ton interface, soit en mettant des getters sur les propriétés nécessaires pour le calcul de la valeur absolue, que tu codes à côté)

Premier exemple :
public static MaClasse Abs(MaClasse monObjet)
{
    if (monObjet.MaValeur < 0)
    {
        return new MaClasse(-monObjet.MaValeur);
    }
    else
    {
        return new MaClasse(monObjet.MaValeur);
    }
}

Premier exemple bis :
public static T Abs<T>(T monObjet)
{
    switch (typeof(T))
    {
        case typeof(MaClasse):     
            if (((MaClasse)monObjet).MaValeur < 0)
            {
                return new (T)(MaClasse(-((MaClasse)monObjet).MaValeur));
            }
            else
            {
                return new (T)(MaClasse(((MaClasse)monObjet).MaValeur));
            }
            break;
    }
}


Deuxième exemple :
public interface IAbsolutable<T>
{
    T GetAbs<T>();
}

public class MaClasse : IAbsolutable<MaClasse>
{
    public MaClasse GetAbs()
    {
        if (this.MaValeur < 0)
        {
            return new MaClasse(-this.MaValeur);
        }
        else
        {
            return new MaClasse(this.MaValeur);
        }
    }
}


PS : Je n'ai pas relu mon code ni ne l'ai testé. C'est possible qu'il y ait des erreurs.

Krimog : while (!(succeed = try())) ;
- Nous ne sommes pas des décodeurs ambulants. Le style SMS est prohibé. -