12
votes

Encapsulation d'Action et Func ?

J'essaie de créer une conception pour une sorte d'interface Iexecutable. Je ne vais pas entrer dans les détails, mais le but est que j'ai plusieurs actions qui doivent être exécutées à partir d'une classe de base. Ils peuvent prendre différents paramètres (pas de gros problème), et ils peuvent ne pas renvoyer une valeur.

Jusqu'à présent, c'est mon design: xxx

jusqu'à présent, Chacune de mes actions concrètes doit être un enfant d'une action et de la base de l'action, mais je n'aime vraiment pas ça. Si je pouvais déplacer la définition de l'exécution à actionbase, envisagez que la classe de béton peut ne pas renvoyer une valeur, j'aurai atteint mon objectif.

Quelqu'un m'a dit que cela pourrait être fait avec l'utilisation de Func et d'Action, pour lesquels je suis totalement d'accord, mais je ne trouve pas un moyen d'avoir cela en une seule classe de sorte que l'appelant sache si l'action va retourner une valeur ou non.

BREF: Je veux faire quelque chose comme: xxx


1 commentaires

En tant que clarification: mon objectif est d'avoir un résumé exécuté dans ActionBase et d'éviter de créer une actionWithResultBase et une actionWithouTResultBase.


4 Réponses :


0
votes

Vous savez que vous pouvez ignorer la valeur de retour d'une méthode exacte? Vous ne avez pas pour l'utiliser.


2 commentaires

Oui, vous êtes correct à ce sujet, mais je ne pense pas que ce serait quelque chose de conception d'avoir. En outre, quelqu'un m'a suggéré de retourner toujours Bool pour ces non-retours qui indiqueraient simplement que l'opération a réussi, mais je pense aussi que ce n'est pas correct. Si l'opération ne doit pas renvoyer une valeur, pourquoi le forcer?


@Alpha - Je suis d'accord avec vous que si une opération ne renvoie pas naturellement quelque chose, cela ne devrait pas. Retourner «True» n'est pas correct car Egnerally, vous ne devriez pas retourner «False», vous devriez vous lancer une exception. Cependant, je ne comprends toujours pas votre objectif de conception - votre objectif semble être basé sur le sucre syntaxique et je ne vois pas ce que vous accomplissez pour que vous ne puissiez pas obtenir d'action et de func à résoudre. Je pense que vous devez expliquer quel est le problème avec eux?



11
votes

Si vous voulez une solution légère, l'option la plus simple consisterait à écrire deux classes en béton. On contiendra une propriété de type action et l'autre une propriété de type Func : xxx

alors vous pouvez construire le deux types comme celui-ci: xxx

si vous ne voulez pas faire action Propriété lecture / écriture, alors vous pourriez passer le délégué d'action en tant que Argument au constructeur et faire la propriété en lecture seule.

Le fait que c # a besoin de deux délégués différents pour représenter des fonctions et des actions est assez gênante. Une solution de contournement que les personnes utilisent est de définir une unité de type qui représente "aucune valeur de retour" et l'utiliser au lieu de void . Ensuite, votre type serait juste Func et vous pouvez utiliser Func au lieu de action . Le type unité pourrait ressembler à ceci: xxx

pour créer un func valeur, vous écrirez : xxx


1 commentaires

Merci. Je sais que j'ai attendu longtemps avant de marquer votre réponse, mais je voulais vraiment voir si quelqu'un est venu avec une solution. Même lorsque votre approche ne résout pas tout à fait le problème, c'est vraiment une bonne réponse et montre une solution de contournement bonne et belle sur la façon de surmonter ce problème.



0
votes

Qu'en est-il de quelque chose de simple: xxx


1 commentaires

J'ai également pensé à quelque chose de similaire, mais mon problème est que je ne saurai pas au moment de la compilation du type de type de compilation. Je pourrais toujours faire d'actionExecuter et faire une déclaration d'exécution T, mais qui bat les situations ont été que je n'ai besoin de rien retourner.



2
votes

Les interfaces suivantes doivent faire le tour - il copie essentiellement le motif nullable xxx


0 commentaires