200 votes

Comment saurai-je quand créer une interface?

Je suis à un stade de mon développement de l'apprentissage, où je me sens comme si je dois en savoir plus sur les interfaces.

J'ai souvent lu à leur sujet, mais il semble juste comme je ne peut pas les saisir.

J'ai lu des exemples tels que: les Animaux de la classe de base, avec IAnimal interface pour des choses comme "Marcher", "Exécuter", 'GetLegs", etc - mais je n'ai jamais été à travailler sur quelque chose et se sentait comme "Hé, je doit utiliser une interface ici!"

Ce qui me manque? Pourquoi est-ce un concept difficile pour moi à saisir! Je suis tout intimidé par le fait que je pourrais ne jamais réaliser un béton besoin - surtout à cause du manque des aspects de la compréhension de! Il me fait sentir que je suis absent quelque chose là-haut en termes d'être un développeur! Si quelqu'un a eu une expérience de ce genre et a eu une percée j'aimerais avoir quelques conseils sur la façon de comprendre ce concept. Je vous remercie.

156voto

Jimmy Points 35501

il résout ce problème concret:

vous avez a, b, c, d de 4 types différents. partout dans votre code vous avez quelque chose comme:

a.Process();
b.Process();
c.Process();
d.Process();

pourquoi pas les mettre en œuvre IProcessable, puis faire

List<IProcessable> list;

foreach(IProcessable p in list)
    p.Process();

cette échelle beaucoup mieux lorsque vous ajoutez, disons, 50 types de classes que tous font la même chose.


Un autre problème concret:

Avez-vous déjà pris un coup d'oeil au Système.Linq.Énumérable? Il définit une tonne de méthodes d'extension qui fonctionnent sur n'importe quel type qui implémente l'interface IEnumerable. Parce que tout ce qui implémente l'interface IEnumerable dit en gros "j'ai le soutien de l'itération dans un non-ordonnée foreach modèle de type", vous pouvez définir des comportements complexes (Count, Max, Où, de Sélectionner, etc.) pour toute énumérable type.

138voto

rmeador Points 15107

J'aime Jimmy répondre à beaucoup, mais je sens que j'ai besoin d'ajouter quelque chose à cela. La clé de tout cela, c'est la "mesure" dans IProcess****. Il indique une capacité (ou de la propriété, mais le sens de "qualité intrinsèque", pas dans le sens de C# propriétés) de l'objet qui implémente l'interface. IAnimal est probablement pas un bon exemple pour une interface, mais IWalkable pourrait être une bonne interface pour être si votre système a beaucoup de choses qui peuvent marcher. Vous pourriez avoir des classes dérivées à partir d'Animaux tels que le Chien, la Vache, le Poisson, Serpent. Les deux premiers seraient probablement mettre en œuvre IWalkable, les deux derniers ne marche pas, de sorte qu'ils ne le feraient pas. Maintenant, vous demandez: "pourquoi ne pas simplement avoir un autre super-classe, WalkingAnimal, le Chien et la Vache tirer?". La réponse est que lorsque vous avez quelque chose de complètement à l'extérieur de l'arbre d'héritage qui peut aussi marcher, comme un robot. Robot devrait mettre en œuvre IWalkable, mais ne serait probablement pas dériver de l'Animal. Si vous voulez une liste de choses qui peuvent marcher, vous tapez comme IWalkable et vous pouvez mettre tous de la marche des animaux de plus de robots dans la liste.

Maintenant, remplacez IWalkable avec quelque chose de plus logiciel-y comme IPersistable, et l'analogie devient beaucoup plus proche de ce que vous verriez dans un programme réel.

74voto

Element Points 2511

Utilisez des interfaces lorsque les implémentations de la même fonctionnalité seront différentes.

Utilisez des classes abstraites / de base lorsque vous devez partager une implémentation concrète commune.

32voto

Larsenal Points 17080

Pensez à une interface comme un Contrat. C'est une façon de dire, "Ces classes doivent suivre ces règles."

Ainsi, dans le IAnimal exemple, c'est une façon de dire, "je dois être capable d'appel de Courir, de Marcher, etc. sur les classes qui implémentent IAnimal."

Pourquoi est-ce utile? Vous désirez peut-être créer une fonction qui s'appuie sur le fait que vous devez être en mesure d'appeler Courir et de Marcher, par exemple, sur l'objet. Vous pourriez avoir le suivant:

public void RunThenWalk(Monkey m) {
    m.Run();
    m.Walk();
}

public void RunThenWalk(Dog d) {
    d.Run();
    d.Walk();
}

... et de répéter que pour tous les objets qui vous le savez peut courir et marcher. Toutefois, avec votre IAnimal interface, vous pouvez définir la fonction une fois comme suit:

public void RunThenWalk(IAnimal a) {
    a.Run();
    a.Walk();
}

Par programmation à l'encontre de l'interface, vous êtes essentiellement faire confiance les classes pour mettre en œuvre l'intention de l'interface. Ainsi, dans notre exemple, la pensée est "je n'aime pas la façon dont ils fonctionnent et à Pied, tant qu'ils courent et Marchent. Mon RunThenWalk sera valable aussi longtemps qu'ils remplissent cet accord. Il fonctionne parfaitement bien sans rien savoir d'autre au sujet de la classe."

Il est également une bonne discussion dans cette question.

20voto

Spencer Ruport Points 24589

Ne vous inquiétez pas tellement. Beaucoup de développeurs, aura rarement besoin d'écrire une interface. Vous arrive d'utiliser les interfaces disponibles au sein de l' .NET framework, mais si vous ne vous sentez pas le besoin d'en écrire un de sitôt, il n'y a rien de surprenant.

L'exemple que je donne toujours à quelqu'un si vous avez un Voilier de classe et une Vipère de la classe. Ils héritent de la classe de Bateau et de la classe de Voiture, respectivement. Maintenant, disons que vous avez besoin de faire une boucle par tous ces objets et de les appeler leur Drive() méthode. Alors que vous pourriez écrire du code comme suit:

if(myObject is Boat)
    ((Boat)myObject).Drive()
else
    if (myObject is Car)
        ((Car)myObject).Drive()

Il serait beaucoup plus simple d'écrire:

((IDrivable)myObject).Drive()

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X