Pourquoi utiliser des Interfaces, Héritage Multiple vs Interfaces, les Avantages des Interfaces?
J'ai encore un peu de confusion à propos de cette chose. Ce que j'ai trouvé jusqu'à maintenant est
(Questions similaires ont déjà été posée ici mais j'ai eu quelques autres points.)
Interface est la collection des SEULES méthodes abstraites et finales des champs.
Il n'y a pas d'héritage multiple en Java.
Interfaces peuvent être utilisées pour atteindre l'héritage multiple en Java.
Un point Fort de l'Héritage, c'est qu'On peut utiliser le code de la classe de base dans la classe dérivée sans écrire de nouveau. Peut-être que c'est la chose la plus importante pour l'héritage d'être là.
Maintenant..
T1. Comme les interfaces sont ayant que des méthodes abstraites (pas de code) alors, comment pouvons-nous dire que si nous mettons en œuvre toute interface, puis c'est l'héritage ? Nous ne sommes pas à l'aide de son code.
T2. Si l'implémentation d'une interface n'est pas l'héritage ensuite la Façon dont les interfaces sont utilisées pour atteindre l'héritage multiple ?
T3. De toute façon quel est l'avantage de l'utilisation d'Interfaces ? Ils sont de ne pas avoir tout le code. Nous avons besoin d'écrire de code encore et encore dans toutes les classes de la mettre en œuvre.
Alors pourquoi faire des interfaces ?
REMARQUE : j'ai trouvé un cas dans lequel les interfaces sont utiles. Un exemple c'est comme dans l'interface Runnable nous avons public void run() la méthode dans laquelle on définit la fonctionnalité de fil et il est intégré dans le codage que cette méthode sera exécutée comme un thread séparé. Donc nous avons juste besoin de coder quoi faire dans le thread, le Reste est pré-défini. Mais cette chose peut également être réalisé en utilisant des classes abstraites et tous.
Alors quels sont exactement les avantages de l'utilisation d'interfaces? Est-il vraiment multi-Héritage que nous obtenons à l'aide d'Interfaces?
Vous devez vous connecter pour publier un commentaire.
Nous ne pouvons pas. Les Interfaces ne sont pas utilisés pour atteindre l'héritage multiple. Ils remplacent avec plus sûr, bien que légèrement moins puissante construction. Remarque le mot-clé
implements
plutôt queextends
.Ils ne le sont pas. Avec des interfaces à une seule classe peut avoir plusieurs "vues", les différentes Api ou de capacités. E. g. Une classe peut être
Runnable
etCallable
dans le même temps, alors que les deux méthodes sont en fait la même chose.Interfaces sont en quelque sorte-de l'héritage multiple avec pas de problèmes de ce dernier introduit (comme le Diamant problème).
Il y a peu de cas d'utilisation pour les interfaces:
Objet a effectivement deux identités: un
Tank
est à la fois unVehicle
et unWeapon
. Vous pouvez utiliser une instance deTank
où soit l'ancien ou le dernier est prévu (polymorphisme). C'est rarement le cas dans la vie réelle et est en fait un exemple où l'héritage multiple serait mieux (ou traits).Simple responsabilités: une instance de
Tank
objet dans un jeu est aussiRunnable
pour vous permettre de l'exécuter dans un thread et unActionListener
pour répondre à des événements de souris.Rappel interfaces: si l'objet implémente donné interface de rappel, il est notifié sur son cycle de vie ou d'autres événements.
Marqueur interfaces: ne pas ajouter toutes les méthodes, mais facilement accessible via
instanceof
à découvrir l'objet de capacités ou de souhaits.Serializable
etCloneable
sont des exemples de cette.Ce que vous êtes à la recherche pour le trait (comme à la Scala), malheureusement indisponible en Java.
Q3
. Avez-vous d'autres questions?Interfaces sont la collecte de finale de la statique des champs et des méthodes abstraites (Nouvellement Java 8 ajout du support de l'avoir des méthodes statiques dans une interface).
Interfaces dans des situations quand on sait que certains tâche qui doit être fait, mais la façon dont il devrait être fait peut varier. En d'autres termes, nous pouvons dire que nous mettons en œuvre des interfaces pour que notre de classe commence à se comporter d'une manière particulière.
Laissez-moi vous expliquer avec un exemple, nous savons tous que les animaux sont. Comme le Lion est un animal de singe est un animal, l'éléphant est un animal, la vache est un animal, et ainsi de suite. Maintenant, nous savons tous les animaux ne manger quelque chose et le sommeil. Mais la façon dont chaque animal peut manger quelque chose ou de sommeil peuvent différer. Comme le Lion mange de la chasse à d'autres animaux où la vache mange de l'herbe. Mais les deux manger. Donc nous pouvons avoir de pseudo-code de cette manière,
Que par le pseudo-code mentionné ci-dessus, tout ce qui est capable de manger ou de dormir sera appelé un animal ou nous pouvons dire qu'il est must pour tous les animaux de manger et de dormir, mais de la façon de manger et de dormir dépend de l'animal.
Dans le cas des interfaces, nous héritons seulement le comportement, et non le code que dans le cas de classes d'héritage.
Mise en œuvre d'interfaces est autre genre d'héritage. Il n'est pas semblable à l'héritage de classes comme dans cet héritage de la classe enfant obtient le code réel de la réutilisation de la classe de base.
Il est dit parce qu'une classe peut implémenter plusieurs interfaces. Mais nous devons comprendre que cet héritage est différent de celui des classes de l'héritage.
Mise en œuvre d'une interface met la contrainte à la classe qu'il doit remplacer son toutes les méthodes abstraites.
Lire la suite dans mon livre ici et ici
BAISER
J'ai cherché pendant des jours, voire des semaines à essayer de comprendre les interfaces et semble lire le même générique de l'aide; je ne suis pas en train de dénigrer les contributions, mais je pense que la lumière d'ampoule juste cliqué, donc je suis super content :))
Je préfère Keep It Simple Stupid, il en sera de proférer une nouvelle vue d'interfaces.
Je suis un casual codeur, mais je tiens à poster ce code que j'ai écrit dans VB.NET (le principe est le même pour les autres langues), pour aider les autres à comprendre les interfaces.
Si j'ai tort, merci de laisser les autres savoir dans les commentaires.
Explication
Trois boutons sur un formulaire, en cliquant sur chaque sauve une autre classe que la référence à l'interface variable (_data). Le point de l'ensemble d'une classe différente de références dans une interface variable, est ce que je ne comprenais pas, car il semble redondant, son pouvoir devient évident avec la msgbox, j'ai seulement besoin de faire appel à la MÊME méthode pour effectuer la tâche dont j'ai besoin, dans ce cas, 'GetData()', qui utilise la méthode de la classe qui est actuellement détenu par l'interface de référence variable (_data).
Si toutefois je souhaite récupérer mes données (à partir d'une base de données, le web ou un fichier texte), il n'est jamais fait à l'aide de la même nom de méthode; le code derrière que la mise en œuvre...je ne se soucient pas.
Il est alors facile de changer de classe à chaque code à l'aide de l'interface sans dépendance...c'est un objectif clé dans OO et l'encapsulation.
Quand utiliser
Code des classes et si vous constatez le même verbe utilisé pour les méthodes, comme " GetData()', alors il est un bon candidat pour mettre en œuvre une interface de classe et d'utiliser le nom de la méthode comme une abstraction /interface.
J'espère sincèrement que cette aide à un camarade de noob avec ce principe était difficile.
instance variable
au lieu deinterface variable
Malheureusement, en familier usage, le mot
inheritance
est encore fréquemment utilisé lorsqu'une classe implémente une interface, bien queinterface implementation
serait un meilleur terme - de l'OMI, le termeinheritance
doit strictement être utilisé avec l'héritage d'une concrète ou abstraite de la classe. Dans des langages tels que C++ et C#, la même syntaxe (c'est à direSubclass : Superclass
etClass : Interface
) est utilisée à la fois l'héritage de classe et d'interface de mise en œuvre, ce qui pourrait avoir contribué à la propagation de l'abus du motinheritance
avec les interfaces. Java a une syntaxe différente pourextend
ing une classe, par opposition àimplement
ing une interface, ce qui est une bonne chose.Vous pouvez obtenir l'effet de l'héritage multiple, au travers de la composition par la mise en œuvre de plusieurs interfaces sur une classe, et puis en fournissant des implémentations pour toutes les méthodes, propriétés et événements de toutes les interfaces sur la classe. Une technique courante de le faire avec les classes de béton est par l'action", a-a' (composition) des relations avec des classes qui implémentent les interfaces externes par le câblage la mise en œuvre de chacune des internes les implémentations de la classe. (Dans des langages tels que C++ ne charge plusieurs béton héritage directement, mais qui crée d'autres problèmes potentiels comme le diamant problème).
Interfaces permettent de classes existantes (par exemple, des cadres) pour interagir avec vos nouvelles classes, sans les avoir jamais vu avant, en raison de la capacité de communiquer par le biais d'une interface connue. Pensez à une interface comme un contrat. Par la mise en œuvre de cette interface sur une catégorie, vous êtes lié contractuellement à respecter les obligations que lui imposent, et une fois que ce contrat est mis en œuvre, votre classe doit pouvoir être utilisé de façon interchangeable avec n'importe quel autre code qui consomme de l'interface.
Un "monde réel", par exemple, la législation et la convention (interface) entourant un électrique de la prise murale dans un pays en particulier. Chaque appareil électrique branché dans la prise des besoins à satisfaire le cahier des charges (contrat) que les autorités ont défini pour le socket, par exemple, le positionnement de la ligne de neutre et de conducteurs de terre, de la position et de la coloration de l'interrupteur on /off, et de la conformité de la la tension, la fréquence et le courant maximum qui sera fourni par le biais de la
interface
lorsqu'il est allumé.L'avantage de découpler l'interface (c'est à dire une prise électrique classique) plutôt que de souder les fils ensemble, c'est que vous pouvez brancher (et débrancher) d'un ventilateur, d'une bouilloire, d'un lit double-adaptateur, ou un nouveau appareil à inventer l'année prochaine en elle, même si cet appareil n'existait pas lorsque l'interface a été conçue. Pourquoi? Parce qu'il va conforme aux exigences de l'interface.
Interfaces sont grands pour le couplage lâche des classes, et sont l'un des piliers de l'Oncle Bob est SOLIDE paradigme, en particulier la
Dependency Inversion Principle
etInterface Segregation Principles
.Il suffit de mettre, en veillant à ce que les dépendances entre les classes sont couplés uniquement sur les interfaces (abstractions), et pas sur les autres classes de béton, il permet à la dépendance pour être remplacée par toute autre catégorie de mise en œuvre qui répond aux exigences de l'interface.
Dans les tests, les talons et se moque de dépendances peut être utilisé pour l'unité de test de chaque classe, et l'interaction de la classe a à la dépendance peut être "spyed" lors de.
interface implementation
vsconcrete inheritance
qui est une distinction très importante. Mais votre dernière utilisation du termeinterface
peut être source de confusion dans le monde réel exemple. Quelque chose peut être fait pour améliorer la clarté? E. g. L'exemple du monde réel, mais de quoi? L'Interface, De L'Héritage? La phrase suivante pourrait conduire à croire qu'il est un exemple d'une interface, mais l'exemple semble être une mise en œuvre concrète.C'est une très vieille question et java-8 release avons ajouté plus de fonctionnalités & alimentation de l'interface.
Une déclaration d'interface peut contenir
Les seules méthodes qui ont des implémentations de l'interface sont par défaut et statique méthodes.
Utilise de l'interface:
Strategy_pattern
Ont un coup d'oeil à cette question SE pour exemple de code pour comprendre les concepts de mieux:
Comment dois-je avoir expliqué la différence entre une Interface et une classe Abstraite?
De revenir à votre question:
Interface peut contenir du code de statique et par défaut méthodes. Ces méthodes par défaut offre une compatibilité descendante & méthodes statiques fournit helper/utilitaire fonctions.
Vous ne pouvez pas avoir de véritable héritage multiple en java et l'interface n'est pas la façon de le faire. L'Interface peut contenir que des constantes. Donc vous ne pouvez pas hériter de l'etat, mais vous pouvez mettre en œuvre des comportements.
Vous pouvez remplacer héritage avec capacité. Interface fournit de multiples capacités pour la mise en œuvre de classes.
Reportez-vous à "utilise de l'interface" dans ma réponse.
L'héritage est quand une classe dérive d'une autre classe (qui peut être abrégé) ou d'une Interface. Le point le plus fort de l'orienté objet (héritage) n'est pas la réutilisation de code (il y a beaucoup de façons de le faire), mais le polymorphisme.
Polymorphisme, c'est quand vous avez le code qui utilise l'interface, dont il est instance de l'objet peut être de n'importe quelle classe dérivée de cette interface. Par exemple, je peux avoir une telle méthode:
public void Animal de compagnie(IAnimal animal) et cette méthode permettra d'obtenir un objet qui est une instance de Chien ou de Chat qui héritent de IAnimal. ou je peux avoir un code:
IAnimal animal
et puis je peux appeler une méthode de l'interface:
animal.Manger() qui le Chien ou le Chat peut mettre en œuvre de manière différente.
Le principal avantage des interfaces, c'est que vous pouvez hériter de certains d'entre eux, mais si vous avez besoin d'hériter d'un seul, vous pouvez utiliser une classe abstraite ainsi. Voici un article qui explique plus sur les différences entre une classe abstraite et une interface:
http://www.codeproject.com/KB/cs/abstractsvsinterfaces.aspx
Vieille question. Je suis surpris que personne n'a cité les sources canoniques: Java: un Aperçu par James Gosling, Design Patterns: Elements de Logiciels Orientés Objets Réutilisables par le Gang de Quatre ou Efficace Java par Joshua Bloch (entre autres sources).
Je vais commencer par une citation:
Maintenant, nous allons prendre vos hypothèses et vos questions une par une (je vais volontairement ignorer la Java 8).
Hypothèses
Interface est la collection des SEULES méthodes abstraites et finales des champs.
Saviez-vous que le mot-clé
abstract
dans les interfaces de Java? Pas de. Ensuite, vous ne devriez pas envisager une interface comme une collection de méthodes abstraites. Peut-être que vous êtes misleaded par le C++ soi-disant interfaces, qui sont des classes avec seulement des méthodes virtuelles pures. C++, de par sa conception, n'a pas (et n'a pas besoin d'avoir des interfaces, parce qu'il a plusieurs héritage.Comme l'a expliqué Gosling, vous devriez plutôt envisager une interface comme "un ensemble de méthodes d'un objet répond à". J'aime voir une interface et de la documentation associée comme un contrat de service. Il décrit ce à quoi vous pouvez vous attendre à partir d'un objet qui implémente cette interface. La documentation devrait préciser les pré-et post-conditions (par exemple, les paramètres doivent être non nulle, la sortie est toujours positif, ...) et les invariants (une méthode qui ne permet pas de modifier l'objet interne de l'état). Ce contrat est le cœur, je pense, de la programmation orientée objet.
Il n'y a pas d'héritage multiple en Java.
En effet.
Rien à ajouter.
Interfaces peuvent être utilisées pour atteindre l'héritage multiple en Java.
Non, simlpy car il n'y a pas d'héritage multiple en Java. Voir ci-dessus.
Un point Fort de l'Héritage, c'est qu'On peut utiliser le code de la classe de base dans la classe dérivée sans écrire de nouveau. Peut-être que c'est la chose la plus importante pour l'héritage d'être là.
Qui a appelé à "la mise en œuvre de l'héritage". Comme vous l'avez écrit, c'est un moyen pratique pour réutiliser le code.
Mais il a un rôle important de contrepartie:
(Il est similaire devis dans Bloch, point 16.)
En fait, l'héritage sert également un autre objectif:
À la fois utiliser le mot-clé
extends
en Java. Vous pouvez avoir des hiérarchies de classes et de hiérarchies d'interfaces. Le premier part de la mise en œuvre, la deuxième part de l'obligation.Questions
T1. Comme les interfaces sont ayant que des méthodes abstraites (pas de code) alors, comment pouvons-nous dire que si nous mettons en œuvre toute interface, puis c'est l'héritage ? Nous ne sommes pas à l'aide de son code.**
La mise en œuvre d'une interface n'est pas l'héritage. C'est la mise en œuvre. Ainsi, le mot-clé
implements
.T2. Si l'implémentation d'une interface n'est pas l'héritage ensuite la Façon dont les interfaces sont utilisées pour atteindre l'héritage multiple ?**
Pas d'héritage multiple en Java. Voir ci-dessus.
T3. De toute façon quel est l'avantage de l'utilisation d'Interfaces ? Ils sont de ne pas avoir tout le code. Nous avons besoin d'écrire de code encore et encore dans toutes les classes de la mettre en œuvre./Alors pourquoi faire des interfaces ?/Quelles sont les avantages de l'utilisation d'interfaces? Est-il vraiment multi-Héritage que nous obtenons à l'aide d'Interfaces?
La question la plus importante est: pourquoi voudriez-vous avoir de multi-héritage? Je pense à deux réponses: 1. pour donner plusieurs types d'un objet; 2. pour réutiliser le code.
Donner plusieurs types à un objet
En programmation orientée objet, un objet peut avoir différents types. Par exemple, en Java, un
ArrayList<E>
a les types suivants:Serializable
,Cloneable
,Iterable<E>
,Collection<E>
,List<E>
,RandomAccess
,AbstractList<E>
,AbstractCollection<E>
etObject
(j'espère que je n'ai pas oublié quelqu'un). Si un objet dispose de différents types, différents consommateurs seront en mesure de l'utiliser sans être conscient de ses spécificités. J'ai besoin d'unIterable<E>
et vous me donnez unArrayList<E>
? C'est ok. Mais si j'ai besoin maintenant d'unList<E>
et vous me donnez unArrayList<E>
, c'est ok aussi. Etc.Comment faites-vous le type d'un objet en programmation orientée objet? Vous avez pris la
Runnable
interface comme un exemple, et cet exemple est parfait pour illustrer la réponse à cette question. Je cite officiel de Java doc:Voici le point: l'Héritage est un moyen pratique de tapant objets. Vous souhaitez créer un thread? Nous allons sous-classe de la
Thread
classe. Vous souhaitez qu'un objet de différents types, nous allons utiliser exerciseur-héritage. Argh. Il n'existe pas en Java. (En C++, si vous souhaitez qu'un objet de différents types, multi-héritage est le chemin à parcourir.)Comment donner plusieurs types à un objet, alors? En Java, vous pouvez taper votre objet directement. C'est ce que vous faites lors de votre classe
implements
laRunnable
interface. Pourquoi utiliserRunnable
si votre un fan de l'héritage? Peut-être parce que votre classe est déjà une sous-classe d'une autre classe, disonsA
. Maintenant, votre classe dispose de deux types:A
etRunnable
.Avec de multiples interfaces, vous pouvez donner plusieurs types à un objet. Vous n'avez qu'à créer une classe qui
implements
plusieurs interfaces. Tant que vous êtes en conformité avec les contrats, c'est ok.De réutiliser le code
C'est un sujet difficile; j'ai déjà cité le GOF sur la rupture de l'encapsulation. Autre réponse mentionné le diamant problème. Vous pourriez aussi penser au Principe de Responsabilité Unique:
Avoir une classe parent peut donner une classe à une raison de changer, en plus de ses propres responsabilités:
Je voudrais ajouter un plus prosaïque question: j'ai toujours un sentiment bizarre quand j'ai essayer de trouver le code source d'une méthode dans une classe et je ne le trouve pas. Puis je me souviens: il doit être défini quelque part dans la classe parent. Ou dans le grand-parent de la classe. Ou peut-être même plus. Une bonne IDE est un atout précieux dans ce cas, mais il reste, dans mon esprit, quelque chose de magique. Rien de semblable avec les hiérarchies des interfaces, depuis la javadoc est la seule chose dont j'ai besoin: un raccourci clavier dans l'IDE et que je me.
Héritage howewer a des avantages:
Un exemple de classe "spécialement conçu et documenté pour l'extension" en Java est
AbstractList
.Mais Bloch et GOF d'insister sur ce point: "Favoriser la composition au cours de l'héritage":
Si vous utilisez la composition, vous n'aurez pas à écrire le même code encore et encore. Il vous suffit de créer une classe qui gère les doublons, et de vous transmettre une instance de cette classe à la classe qui implémente l'interface. C'est un moyen très simple de réutiliser le code. Et cela vous aide à suivre le Principe de Responsabilité Unique et rendre le code plus testable. De rouille et d'Aller n'ont pas d'héritage (ils n'ont pas de classes soit), mais je ne pense pas que le code est plus inutile que dans d'autres langages OOP.
En outre, si vous utilisez la composition, vous vous retrouverez naturellement en utilisant des interfaces de donner votre code, la structure et la flexibilité dont elle a besoin (voir les autres réponses sur des cas d'utilisation des interfaces).
Remarque: vous pouvez partager le code avec Java 8 interfaces
Et enfin, une dernière citation:
Les deux Méthodes de Travail (Interfaces et de l'Héritage Multiple).
Rapide Pratique À Réponse Courte
Interfaces sont mieux quand vous avez plusieurs années d'expérience dans l'utilisation de l'Héritage Multiple qui ont des Super-Classes avec seulement la définition de la méthode, et pas de code du tout.
Une question complémentaire peut être: "Comment et Pourquoi migrer de code à partir des Classes Abstraites Interfaces".
Si vous n'êtes pas à l'aide de nombreuses classes abstraites, dans votre application, ou vous n'avez pas beaucoup d'expérience avec elle, vous préférez peut-être sauter interfaces.
Ne pas se précipiter pour utiliser les interfaces.
Longue Et Ennuyeuse Réponse
Interfaces sont très similaires, ou même équivalent pour les Classes abstraites.
Si votre code a beaucoup de classes Abstraites, puis il est temps de commencer à penser en termes d'Interfaces.
Le code suivant avec les classes abstraites:
MyStreamsClasses.java
Peut être remplacé par:
MyStreamsInterfaces.java
Acclamations.
T1. Comme les interfaces sont ayant que des méthodes abstraites (pas de code) alors, comment pouvons-nous dire que si nous mettons en œuvre une interface puis c'est l'héritage? Nous ne sommes pas à l'aide de son code.
Il n'est pas égal à l'héritage. C'est juste similaire. Laissez-moi vous expliquer:
Si vous voyez uniquement ligne1 et ligne2 vous pouvez en déduire que VolvoV2 et VolvoV3 ont le même type. Vous ne pouvez pas déduire si Volvo une super-classe ou Volvo est une interface.
T2. Si l'implémentation d'une interface n'est pas l'héritage ensuite la Façon dont les interfaces sont utilisées pour réaliser de multiples héritages?
Maintenant à l'aide d'interfaces:
Si vous voyez uniquement ligne1 et ligne2 vous pouvez en déduire que VolvoXC90 et VolvoXC95 ont le même type (Volvo). Vous ne pouvez pas en déduire que Volvo est une super-classe ou Volvo est une interface.
Si vous voyez uniquement line2 et line3 vous pouvez en déduire que Volvo95 met en œuvre deux types, XCModel et Volvo, en Java, vous savez que l'un au moins a une interface. Si ce code a été écrit en C++, par exemple, ils pourraient être les deux classes. Par conséquent, plusieurs héritages.
T3. De toute façon, quel est l'avantage de l'utilisation d'Interfaces? Ils sont de ne pas avoir tout le code. Nous avons besoin d'écrire de code encore et encore dans toutes les classes de la mettre en œuvre.
Imaginer un système où vous utilisez un VolvoXC90 classe dans 200 autres classes.
Si vous avez besoin de faire évoluer votre système pour lancer VolvoXC95 vous devez modifier les 200 autres classes.
Maintenant, imaginez un système où vous utilisez un Volvo interface à 10 000 000 de classes.
Maintenant, si vous avez besoin de faire évoluer votre système pour créer VolvoXC95 modèles que vous avez à modifier une seule classe, l'Usine.
C'est une question de bon sens. Si votre système est composé que de quelques classes et ont peu de mises à jour de l'utilisation des Interfaces de partout, c'est contre-productif. Pour les grands systèmes, il peut vous faire économiser beaucoup de douleur et d'éviter les risques en adoptant des Interfaces.
Je vous recommande de lire plus à propos de S. O. L. I. principes D et de lire le livre Efficace Java. Il a de bonnes leçons de l'expérience des ingénieurs en logiciel.
Interfaces sont faits de sorte qu'une classe sera de mettre en œuvre la fonctionnalité au sein de l'interface et de se comporter en conformité avec cette interface.
Donc. Il y a beaucoup d'excellentes réponses ici d'expliquer en détail ce qu'est une interface. Pourtant, c'est un exemple de son utilisation, à la manière d'un de mes meilleurs collègues jamais me l'a expliqué il y a des années, avec ce que j'ai appris à l'université dans les deux dernières années, mélangé dans.
Une interface est une sorte de "contrat". Il expose quelques méthodes, champs et ainsi de suite, qui sont disponibles. Ils ne révèlent aucun de ses détails de mise en œuvre, seulement de quoi il en retourne, et quels sont les paramètres qu'il faut. Et c'est là que réside la réponse à la question trois, et ce que je ressens est l'un des plus grands atouts de l'modernes de la programmation orientée objet:
C'est ce qu'il a appelé au moins, et il peut avoir à partir d'une autre place.L'exemple de code ci-dessous est écrit en C#, mais tout ce qui est montré peut être fait à peu près de la même manière en Java.
Ce que nous voyons est une classe appelée SampleApp, qui a un seul champ, les IOContext. IOContext est une interface.
SampleApp n'a pas la garde de l'esprit sur la façon dont il enregistre les données, il a juste besoin de le faire, dans son "doSomething()" la méthode.
On peut imaginer qu'au début du processus de développement, de l'enregistrement des données peuvent avoir été plus important que la FAÇON dont il a été sauvé, et donc, le développeur a choisi d'écrire tout simplement le FileContext classe. Plus tard, cependant, il est nécessaire pour le support de JSON pour quelque raison que ce soit. Il écrivit alors la JSONFileContext classe qui hérite de FileContext. Cela signifie qu'il est effectivement un IOContext, qui a la fonctionnalité de FileContext, enregistrez le remplacement de FileContexts SaveData et LoadData, il utilise toujours son "lecture/écriture" des méthodes.
La mise en œuvre de la classe JSON a été une petite quantité de travail, en les comparant à l'écriture de la classe, et de l'avoir juste hériter IOContext.
Le domaine de la SampleApp, aurait tout de type "FileContext", mais de cette façon, il aurait été limitée à jamais en utilisant uniquement les enfants de la classe. En faisant de l'interface, on peut même faire de la SQLiteContext mise en œuvre, et écrire dans une base de données, SampleApp ne pourra jamais savoir ou de soins, et lorsque nous avons rédigé le sql lite de classe, nous avons besoin d'effectuer un changement à notre code:
new JSONFileContext();
devient plutôtnew SQLiteContext();
Nous avons encore nos vieilles implémentations et peut revenir à ceux si le besoin s'en fait sentir. Nous avons cassé rien, et toutes les modifications apportées à notre code de déontologie est une demi-ligne, qui peut être modifié dans le clignotement d'un oeil.
donc: Code en plus, non PAS par la modification.
Interfaces
Une interface est un contrat définissant la façon d'interagir avec un objet. Ils sont utiles pour exprimer votre internals l'intention d'interagir avec un objet. Suivant Inversion de Dépendance votre API publique aurait tous les paramètres exprimés avec les interfaces. Vous ne se soucient pas comment il fait ce que vous avez besoin de faire, c'est juste que c'est exactement ce dont vous avez besoin.
Exemple: Vous pouvez tout simplement besoin d'un
Vehicle
pour le transport de marchandises, vous n'avez pas de soins sur le mode de transport particulier.Héritage
L'héritage est une extension d'une implémentation particulière. Que la mise en œuvre peut ou peut ne pas satisfaire à une interface particulière. Vous devez vous attendre à un ancêtre d'un particulier de la mise en œuvre uniquement lorsque vous vous souciez de la façon dont.
Exemple: Vous pouvez avoir besoin d'un
Plane
la mise en œuvre d'un véhicule pour le transport rapide.Composition
Composition peut être utilisée comme une alternative à l'héritage. Au lieu de votre classe de l'extension d'une classe de base, il est créé avec des objets qui mettent en œuvre de plus petites portions de la classe principale de la responsabilité. La Composition est utilisée dans le
facade pattern
etdecorator pattern
.Exemple: Vous pouvez créer un
DuckBoat
(DUKW) de la classe qui implémenteLandVehicle
etWaterVehicle
qui mettent en œuvreVehicle
composé deTruck
etBoat
implémentations.Réponses
Interfaces ne sont pas l'héritage. La mise en œuvre d'une interface exprime que vous avez l'intention de votre classe à opérer dans la manière dont est défini par l'interface. L'héritage, c'est quand vous avez un ancêtre commun, et vous recevez le même comportement (
inherit
) comme l'ancêtre de sorte que vous n'avez pas besoin de la définir.Interfaces de ne pas atteindre l'héritage multiple. Ils expriment qu'une classe peut être adapté pour de multiples rôles.
L'un des principaux avantages des interfaces est de fournir à la séparation des préoccupations:
Dans l'esprit de
DRY
vous pouvez écrire une application qui répond à une interface et de les modifier tout en respectant laopen/closed principal
si vous utilisez la composition.Interfaces are not inheritance.
, de cette façon, il contribue à briser la définition où moi comme un noob est quand même de la difficulté à voir les différentes et semblables. anywho, merci pour les explications.