Pourquoi exprimées à une interface?
Jesse Liberty de Programmation C# (p.142), il fournit un exemple dans lequel il jette un objet à une interface.
interface IStorable
{
...
}
public class Document : IStorable
{
...
}
...
IStorable isDoc = (IStorable) doc;
...
Quel est l'intérêt de cette mesure, notamment si la classe de l'objet implémente l'interface de toute façon?
EDIT1: Pour clarifier, je suis intéressé par le raison de la fonte (le cas échéant), pas la raison de la mise en œuvre d'interfaces. Aussi, le livre est son 2001 de la Première Édition (basé sur le C#1 afin de l'exemple peut ne pas être pertinent pour les dernières versions de C#).
EDIT2: j'ai ajouté un peu de contexte pour le code
- Ma première hypothèse était explicite conversion définie par l'utilisateur, mais en fait d'après (6.4.1) vous ne pouvez pas définir explicitement définis par l'utilisateur en fonte pour une interface.
- J'ai trouvé l'article équivalent dans la version la plus récente, mais il semble que c'est un peu différent.
- merci pour regarder, jusqu'
- Voulez-vous dire pourquoi le cast explicite à une interface, ou voulez-vous dire "pourquoi s'en jetant de l'interface à tous?"
- Je veux dire pourquoi le cast explicite et est-il nécessaire/utile/redondante?
Vous devez vous connecter pour publier un commentaire.
Il n'y a qu'une seule raison lorsque vous avez réellement besoin d'un plâtre: Quand le doc est d'un type de base d'un objet qui implémente IStorable. Laissez-moi vous expliquer:
IStorable
à unIStorable
variable en lieu et place de EDIT2.Parce que vous voulez vous limiter aux seules méthodes fournies par l'interface. Si vous utilisez la classe, vous courez le risque de l'appel d'une méthode (par inadvertance) qui ne fait pas partie de l'interface.
Si l'objet implémente l'interface explicitement (
public void IStorable.StoreThis(...)
) que le casting est le moyen le plus facile pour atteindre l'interface de membres.Je ne suis pas sûr, en vertu de ce contexte, l'exemple a été donné dans le livre. Mais, en général, vous pouvez saisir effectuer un cast d'un objet à l'interface pour obtenir l'héritage multiple. J'ai donné l'exemple ci-dessous.
Ce serait d'afficher
C'est assez difficile à dire sans plus de contexte. Si la variable
doc
est déclaré être d'un type qui implémente l'interface, puis le casting est redondant.La version du livre lisez-vous? Si c'est "Programmation C# 3.0" je vais jeter un oeil ce soir, quand je suis à la maison.
EDIT: Comme nous l'avons vu dans les réponses jusqu'à présent, il y a trois questions ici:
doc
est un type de compilation)La
doc
objet peut être d'un type qui implémente les membres deIStorable
explicitement, pas de les ajouter à la les classes de primaire de l'interface (c'est à dire, ils ne peuvent être appelés via l'interface).Fait "casting" (à l'aide de l' (T) de la syntaxe) n'a aucun sens puisque C# poignées upcasts (en fonte de type parent) automatiquement (à la différence de F# par exemple).
Il y a beaucoup de bonnes réponses ici, mais je ne pense vraiment pas qu'ils de répondre à POURQUOI vous VOULEZ vraiment utiliser le plus restrictif interface possible.
Les raisons de ne pas impliquer vos premières de codage, ils impliquent la prochaine fois que vous visitez ou de refactoriser le code--ou quand quelqu'un d'autre le fait.
Disons que vous voulez un bouton et placez-le sur votre écran. Vous avez trouvé le bouton soit transmis ou à partir d'une autre fonction, comme ceci:
Vous arrive de savoir que VisibleThingy est un bouton, il renvoie un bouton, donc tout est cool ici (aucune conversion n'est nécessaire).
Maintenant, disons que vous permet de refactoriser VisibleThingy retour d'un bouton à bascule à la place. Vous avez maintenant de revoir votre méthode car vous en savait trop sur la mise en œuvre.
Puisque vous n'avez BESOIN que les méthodes d'un Composant (un parent de deux boutons et de Basculer, ce qui pourrait avoir été une interface--même chose assez bien pour nos fins), si vous aviez écrit que la première ligne comme ceci:
On n'aurait pas eu de refactoriser rien -, il aurait simplement travaillé.
C'est un cas très simple, mais il peut être beaucoup plus complexe.
Donc je suppose que le résumé peut être qu'une interface est une manière de "voir" votre objet, comme regarder à travers un filtre...vous ne pouvez voir certaines de ses parties. Si vous pouvez restreindre votre point de vue assez, l'objet peut "Morph" derrière votre point de vue particulier et pas d'effet sur quoi que ce soit dans votre monde actuel-un très puissant truc de l'abstraction.
La meilleure raison pourquoi vous mettrait à des interfaces serait si vous écrivez du code contre des objets et vous ne savez pas quel type de béton qu'ils sont et vous ne voulez pas.
Si vous savez que vous pouvez venir à travers un objet qui implémente une interface spécifique, vous pouvez obtenir les valeurs de l'objet sans avoir à connaître la classe de béton que cet objet est. Aussi, si vous savez qu'un objet implémente une interface donnée, cette interface peut définir des méthodes que vous pouvez exécuter à prendre certaines mesures sur l'objet.
Voici un exemple simple:
l'exécution de ce petit programme vous donnera le résultat suivant:
Notez que je n'ai pas besoin d'écrire du code dans la méthode DoSomething qui m'a obligé de savoir quelque chose au sujet de tous les objets que je travaillais sur le béton des types d'objet. La seule chose que je sais c'est que je suis en train de travailler sur des objets qui sont au moins une instance de la classe de Contrôle. Je peux alors utiliser l'interface pour trouver de quoi d'autre ils pourraient avoir.
Il y a un million de raisons différentes qui vous permettrait de prendre cette approche avec des interfaces sur vos objets, mais cela vous donne un lâche moyen d'accéder à vos objets sans avoir à connaître exactement ce que c'est.
De penser à toutes les cartes de crédit dans le monde, chaque entreprise fait de leur propre, l'interface est la même, de sorte que chaque lecteur de carte peut avoir une carte glissée dans ce qui suit la norme. Similaire à l'utilisation d'interfaces.
Comme il a été noté, le casting est superflu et inutile. Cependant, c'est une forme explicite de codage, ce qui serait utile pour les débutants dans l'aide à leur compréhension.
Dans un cours d'introduction pour les manuels scolaires, il est préférable explicitement de la loi, plutôt que de laisser la compliler faire les choses de manière implicite, ce qui serait plus déroutant pour les débutants.
Le "doc" n'est pas de type "IStorable" de sorte qu'il serait source de confusion pour les débutants de voir qu'il est affecté à un isDoc. Explicitement de la coulée, l'auteur (du livre et du code), c'est dire qu'un document peut être castée pour un IStorable objet, mais elle n'est PAS LA MÊME chose qu'un IStorable objet.
Le point est, de l'objet (où avez-vous l'obtenir?) mai pas implémenter l'interface, dans ce cas, une exception est levée, qui peuvent être capturées et traitées. Bien sûr, vous pouvez utiliser le "est" de l'opérateur de vérifier, et le "comme" opérateur de cast au lieu de la C-style fonte.
À permettre, pour la plupart, le découplage entre les morceaux de code...
Voir l'article suivant pour plus d':
Interfaces