8
votes

Étendre une structure existante en C # pour ajouter des opérateurs

Je veux étendre la couleur structure intégrée de .NET pour ajouter de nouveaux opérateurs comme + ou - .
Je vais les utiliser comme: xxx

est-ce possible? Si oui, comment?


9 commentaires

Je ne suis pas sûr que cela puisse être fait, mais je suis très curieux de savoir quel serait le résultat de «rouge - bleu»?


@ N8WRL: bizarre en effet, mais je m'attendais à un - pour supprimer les valeurs RVB de l'autre.


@ N8WRL Quel que soit le contraire du violet, c'est probablement :-)


Il effectuera une soustraction de composants-sages pour des couleurs régulières 24 bits, telles que les rouges, les verts et les bleus soustraits. Ceci est juste un exemple simple à démontrer, évidemment, le résultat sera rouge dans cet exemple (car je vais convertir les valeurs négatives en 0), mais je ne l'utiliserai pas pour "soustraire le rouge de bleu" :)


OK, tout le monde, oubliez couleur pour éviter toute confusion supplémentaire. C'est une question C # après tout :) dire si l'extension d'une structure existante avec un opérateur est possible ou non ..


Étant donné que les méthodes d'extension s'étendent la classe / la structure, elles ne peuvent pas être utilisées pour Remplacer les méthodes existantes . Ils peuvent toutefois être utilisés pour créer des méthodes surchargées avec différentes signatures.


@Yuck il parle spécifiquement des extensions de l'opérateur. Je sais que j'ai lu quelque chose d'Eric Lippert sur eux dans le passé comme une fonctionnalité future possible, mais n'avait aucun plan en ce moment. Je n'ai pas de lien à portée de main sur l'endroit où je le lis.


@Sawyer: vous avez raison; Nous avons envisagé d'ajouter des opérateurs de vulgarisation au C # 4.0 mais nous avons choisi de ne pas avoir le temps et le budget pour cela. Peut-être dans une version future hypothétique.


Si la classe n'est pas scellée comme votre cas, vous pouvez hériter de la classe et définir votre propre opérateur à cette interface étendue.


7 Réponses :


8
votes

Il n'y a aucun moyen de le faire avec les opérateurs intégrés.

Vous pouvez écrire une méthode d'extension à la sorte de faux, cependant: xxx


4 commentaires

Votre syntaxe est fausse pour définir une méthode d'extension sur couleur . Doit être un statique classe avec statique .


Je viens de remarquer que je manquais les modificateurs statiques .


@Sawyer, supprimer retour null . Couleur C'est un type de valeur.


@Kirill Eh bien, il ne s'agissait que d'exprimer l'idée, d'où le commentaire sur la magie.



1
votes

2 commentaires

Je connais des méthodes de vulgarisation, mais je me demandais simplement la possibilité d'utiliser des opérateurs.


Que regarder @iandotkelly répondre.



3
votes

Les structures et les classes de C # partagent beaucoup de similitudes, mais une de plusieurs différences est que vous ne pouvez pas sous-classer une structure. Vous pouvez utiliser une méthode d'extension pour implémenter une méthode add () ou soustraire (), mais vous ne pouvez pas écrire une surcharge d'opérateur dans une méthode d'extension.

Si j'étais vous et que je voulais vraiment prolonger la fonctionnalité d'une structure existante comme celle-ci, j'enverrais la structure dans ma propre classe.


1 commentaires

+1 Cela semble être un endroit étrange pour utiliser des méthodes d'extension.



0
votes

Je dirais que ceux-ci existaient déjà, parlez-vous de les redéfinir? Ce sont des opérations sur Alpha et RVB des couleurs. Voir ci-dessous:

http://msdn.microsoft. com / fr-nous / bibliothèque / system.windows.media.color.op_subtraction.aspx

http://msdn.microsoft. com / fr-nous / bibliothèque / system.windows.media.color.op_addic.aspx


1 commentaires

L'objet couleur L'OP vous demande d'exister existe dans le système System.Drawing Espace de noms. Pas celui que vous avez référencé.



5
votes

Comme les autres suggéraient, vous pouvez aller soit la méthode de prolongation du moyen de la méthode de prolongation, soit la méthode de décorateur.

Toutefois, considérez que la couleur a un nombre juste de propriétés et de méthodes, donc les redirections de la classe de décorateur à votre couleur emballée. Les structures signifieront écrire beaucoup de chaudières. Si vous allez ce parcelle, cependant, vous pouvez effectivement définir les opérateurs et même les conversions implicites de votre classe à la couleur et l'inverse (afin que vous puissiez les utiliser plus interchangeable), comme celui-ci: P>

MyColor c = System.Drawing.Color.AliceBlue; // assigning a Color to a MyColor
                                            // thanks to the implicit conversion
Console.WriteLine(c.ToString()); // writes "Color [AliceBlue]"


2 commentaires

C'est un très bel exemple pour une référence, mais (dans ma situation actuelle), il suffirait de faire tout ce qui est plus difficile. Nice code cependant, les opérateurs implicites nettoient vraiment les choses pendant l'écriture de code.


@can poyrazoğlu je suis d'accord. J'utiliserais personnellement des extensions dans votre scénario: mon exemple était plus destiné à vous montrer ce qu'un gâchis l'autre sens deviendrait avec une "grande" structure comme une couleur ....



0
votes

Si vous ne pouvez pas prolonger quelque chose, vous pouvez également créer une classe ou une structure d'emballage. Dans de nombreux cas, une composition est en fait plus puissante et flexible qu'une extension.

Il permet de multiples héritage, vous pouvez facilement mettre à niveau / envelopper un objet existant, etc.

Je ne dis pas que c'est la meilleure réponse à cette question, mais certainement quelque chose qui vaut la peine d'être envisagé. :)


0 commentaires

1
votes

C'est une question ancienne, mais puisqu'elle est arrivée sur mon DuckduckgoSearch, je pense que cela devrait être répondu.

vous peut strong> faire cela en C #. Maintenant tu peux, quand même. Peut-être pas il y a 9 ans lorsque cela a été demandé. P>

Voir cette documentation pour toutes les informations dont vous avez besoin: https://docs.microsoft.com/ EN-US / DOTNET / CSHARP / Langue-Référence / Opérateurs / Surcharge de l'opérateur P>

À l'intérieur d'une structure, il ressemble à ceci: p>

public static Fraction operator -(Fraction a, Fraction b)
        => a + (-b);


0 commentaires