Modèle affiche délégué de classe

Tout d`abord, nous modifions DataModel et en faisons une classe singleton: maintenant que vous pouvez voir une différence entre “classe” et “délégation” modèles de conception, au moins théoriquement, nous allons voir les implications de ces modèles de conception ont sur les modèles mentaux que nous utilisons pour raisonner notre Code. Généralement parlées: utiliser la délégation comme alternative à l`héritage. L`héritage est une bonne stratégie, lorsqu`il existe une relation étroite entre le parent et l`objet enfant, cependant, les couples d`héritage des objets de très près. Souvent, la délégation est le moyen le plus flexible d`exprimer une relation entre les classes. A propos de la seule différence est que les littéraux d`objet nécessitera toujours, séparateurs de virgule entre les éléments alors que la syntaxe de classe ne fonctionne pas. Concession assez mineure dans l`ensemble du système des choses. Une façon que nous pouvons rendre le code ci-dessus un peu plus prévisible est de refactoriser la partie décisionnelle de notre protocole de délégué pour utiliser une fermeture à la place. De cette façon, notre utilisateur d`API sera obligé de spécifier la logique utilisée pour décider quels fichiers qui seront importés à l`avance, supprimant l`ambiguïté dans la logique de notre importateur de fichiers: pour utiliser ce rappel dans la classe ViewController, nous lui assignons simplement une méthode appropriée (encore une fois utilisant le Self faible): nous installons un filtre d`événement sur la boîte de spin pour s`assurer qu`il se comporte d`une manière qui est cohérente avec d`autres délégués. L`implémentation du filtre d`événements est fournie par la classe de base.

Le principal avantage de ce qui précède est qu`il devient maintenant beaucoup plus difficile d`utiliser notre classe FileImporter “la mauvaise façon”, car il est maintenant complètement valide pour l`utiliser sans même assigner un délégué (qui dans ce cas pourrait être utile dans le cas où certains fichiers devraient être importés dans le dos Nous ne sommes pas vraiment intéressés par le résultat de l`opération). Lors de la réimplémentation de cette fonction dans une sous-classe, vous devez mettre à jour la zone détenue par la variable Rect de l`option, à l`aide de la variable d`état de l`option pour déterminer l`état de l`élément à afficher et ajuster la façon dont il est peint en conséquence. Ainsi, vous avez créé deux classes: ViewController et DataModel: MulticastDelegate est une classe spéciale. Les compilateurs et d`autres outils peuvent dériver de cette classe, mais vous ne pouvez pas en dériver explicitement. La même chose est vraie de la classe Delegate. C`est une honte (pas terriblement surprenant, mais légèrement ennuyeux) que cela est interdit. Si vous avez fait une référence à une propriété/méthode qui n`existait pas dans l`un ou l`autre endroit, vous auriez une récursivité infinie sur la boucle [[prototype]]. Mais si toutes les références étaient strictement présentes, alors B pourrait déléguer à A, et vice versa, et il pourrait fonctionner.

Cela signifierait que vous pourriez utiliser l`un ou l`autre des objets à déléguer à d`autres, pour diverses tâches. Il y a quelques cas d`utilisation de niche où cela pourrait être utile. Si vous avez passé beaucoup de temps avec la programmation orientée classe (dans JS ou d`autres langages), vous êtes probablement familier avec l`introspection de type: inspecter une instance pour savoir quel type d`objet il est. L`objectif principal de l`introspection de type avec les instances de classe est de raisonner sur la structure/les capacités de l`objet en fonction de la façon dont il a été créé. Il est juste de dire que certains de ces un peu suce. Par exemple, intuitivement (avec des classes), vous voudrez peut-être être en mesure de dire quelque chose comme bar instanceof foo (parce qu`il est facile de mélanger ce que «instance» signifie penser qu`il comprend «héritage»), mais ce n`est pas une comparaison raisonnable dans JS. Vous devez faire bar. prototype instanceof foo à la place. Avec cette approche de style OLOO, nous ne pensons pas que widget comme un parent et Button comme un enfant.