7
votes

Pourquoi ai-je besoin d'ienumerator.current dans une classe implémentant Ienumerator ?

J'ai une classe qui implémente ienumerator . Voir ci-dessous: XXX

Outre le fait que la propriété .Current existe à la fois sur l'interface ienumerator interface (qui ienumerator hérite), quel est le point de la mettre en œuvre? Comme on le voit ci-dessus, il n'est même pas appelé.


0 commentaires

3 Réponses :


17
votes

ienumerator code> implémente ienumerator code>, donc au niveau le plus élémentaire que vous devez remplir le contrat.

Spécifiquement quant à pourquoi - Que se passe-t-il si quelqu'un Ceci: P>

((IEnumerator)yourInstance).Current


1 commentaires

+1 pour donner un exemple sur la manière dont la mise en œuvre d'ienumerator.current pourrait être appelée dans ce cas.



3
votes

La raison est que ienumerator hériter ienumerator donc lorsque vous héritez de ienumerator vous héritez implicitement de Ienumerator . Si vous annoncez une interface, vous devez également fournir une implémentation de cette interface, même si vous n'avez jamais l'intention de l'utiliser.


0 commentaires

1
votes

Le compilateur vous oblige à implémenter toutes les virtuelles car il ne peut pas éventuellement savoir quelles seront appelées lorsque un assemblage imprévu charge votre assemblage à un moment donné de l'avenir inconnu. En héritant d'une interface, vous «signer un contrat» qui promet de mettre en œuvre tous ses membres. Le compilateur vous détient à cet accord afin que d'autres assemblées puissent s'appuyer dessus.

Le but de la fonction d'interface est de permettre à votre classe de raconter à tout autre assemblage, n'importe où, à tout moment, "C'est ce que vous pouvez me demander de faire". Si vous souhaitez annoncer une fonctionnalité moindre, définissez une nouvelle interface qui fournit uniquement la fonctionnalité partielle que vous souhaitez et mettez-la à la place.

Bien sûr, tout cela est la force industrielle. C'est plus que ce dont vous avez besoin pour votre code en ce moment. Mais C # est censé être utile pour faire des choses sérieuses, pas seulement des jouets.

Quant aux deux remplaçants différents et presque identiques: vous devez remplacer les propriétés actuelles car elles sont essentiellement différentes: l'une est une déclaration générique t; L'autre est un objet de retour non générique. Vous pouvez toujours traiter une référence de chaîne comme référence à l'objet, mais cela ne va pas dans les deux sens. Et alors qu'en est-il des types de valeur? T n'est pas contraint d'être une classe. Bien sûr, le compilateur pourrait comprendre de manière hypothétique pour vous et vous laisser tomber le crochet dans des cas où les deux sont fongibles, mais ce n'est pas le cas, et je ne suis pas convaincu que cela devrait. Si vous voulez C ++, vous savez où le trouver.


0 commentaires