2017-04-09 6 views
-1

Je souhaite laisser un utilisateur spécifier une couleur personnalisée pour une classe dans le constructeur en transmettant des octets RGBA. Si elles ne spécifient pas de couleur personnalisée, une couleur par défaut des paramètres de l'application sera utilisée. Si l'Alpha est omis, cependant, supposer complètement opaque.Vérifiez si l'argument d'octet optionnel a été passé en

Ce que je voudrais:

public MyClass(byte r_col = -1, byte g_col = -1, byte b_col = -1, byte a_col = 255) 
{ 
    if (r_col == -1 | g_col == -1 | b_col == -1) 
    { 
     // use default color 
    } 
    else 
    { 
     this.color = System.Windows.Media.Color.FromArgb(a_col, r_col, g_col, b_col); 
    } 
} 

Cependant, il n'y a pas de valeur « mal » pour un octet (-1 est invalide), donc je suis incapable de détecter si un octet réellement passé dans la fonction . Quelles options ai-je? Je voudrais éviter la surcharge de fonction si possible.

+2

En fait, il s'agit d'une mauvaise conception d'API, car vous autorisez l'appelant à transmettre certaines valeurs qui seront ignorées. Par exemple. que se passera-t-il si l'appelant ne passe que R et G? Ils ne devraient être autorisés à passer rien, RVB ou RVBA, et pour cela vous avez besoin de surcharges –

+0

Bon point - pour l'instant il utilise la couleur par défaut (et ne donne aucune erreur). Je suppose que la surcharge serait la méthode la plus complète ici. – Michael

Répondre

1

surcharge de fonction est beaucoup plus belle dans ce cas:

public MyClass() 
{ 
    //Default color 
} 
public MyClass(byte r_col, byte g_col, byte b_col) 
{ 
    color = Color.FromArgb(r_col, g_col, b_col); 
} 
public MyClass(byte a_col, byte r_col, byte g_col, byte b_col) 
{ 
    color = Color.FromArgb(a_col, r_col, g_col, b_col); 
} 

Bien sûr, il est possible de le faire sans (comme Micheal récolement), mais il est (P.Kouverakis mentionné) pas une bonne conception de l'API. Parce que si vous laissez l'utilisateur entrer des paramètres qui ne sont pas autorisés, cela peut rendre difficile le suivi des bogues. Ne craignez jamais plus de travail pour un meilleur résultat - dans ce cas, utilisez des surcharges de fonctions.

0

Je suppose que c'est une des raisons pour lesquelles C# a des types Nullable. Le code suivant a bien fonctionné en utilisant un type Nullable pour vérifier si les arguments utilisables ont été passés dans

public MyClass(byte? r_col = null, byte? g_col = null, byte? b_col = null, byte a_col = 255) 
{ 
    if (r_col == null | g_col == null | b_col == null) 
    { 
     // use default color 
    } 
    else 
    { 
     System.Windows.Media.Color.FromArgb(a_col, 
              r_col.GetValueOrDefault(), 
              g_col.GetValueOrDefault(), 
              b_col.GetValueOrDefault()); 
    } 
} 

Ceci est une réponse à ma propre question -. D'autres suggestions sont également appréciés.

+1

En fait, je ne pense pas que la méthode 'GetCalueOrDefault()' soit nécessaire ici - '.Value' devrait le faire, comme vous l'avez déjà vérifié. Mais pourquoi n'utilisez-vous qu'une seule barre verticale au lieu de deux? Je ne suis pas sûr que cela fonctionnerait ... – MetaColon

+0

Bien que cela fonctionne de toute façon, je pense que vos suggestions se traduiraient par une exécution légèrement plus rapide. – Michael