Dire que vous avez l'suivantes (simplifié):
Airplane plane = new MyAirplane();
Ensuite à vous de faire toutes sortes de choses avec elle:
List<Airplane> formation = ...
// superclass is important especially if working with collections
formation.add(plane);
// ...
plane.flyStraight();
plane.crashTest();
// ... insert some other thousand lines of code that use plane
Chose est. Lorsque vous décidez subitement de changer votre plan de
Airplane plane = new PterdodactylSuperJet();
tous vos autres code que j'ai écrit ci-dessus tout fonctionne (différemment, bien sûr) parce que l'autre code s'appuie sur l'interface (lire:les méthodes publiques) fournis par le général Airplane
classe, et non pas à partir de la mise en œuvre effective de vous fournir, au début. De cette façon, vous pouvez passer sur les différentes mises en œuvre sans modifier votre code.
Si vous n'avez pas utilisé un Airplane
superclasse et juste écrit MyAirplane
et PterdodactylSuperJet
dans le sens que vous remplacer
MyAriplane plane = new MyAirplane();
avec
PterdodactylSuperJet plane = new PterdodactylSuperJet();
ensuite, vous avez raison sur un point: le reste de votre code peut encore travailler. Mais que se passe juste à travailler, parce que vous avez écrit la même interface (méthodes publiques) dans les deux classes, sur le but. Si vous (ou une autre dev) la modification de l'interface dans une classe, aller-retour entre l'avion classes de rendre votre code inutilisable.
Modifier
Par sur le but , je veux dire que vous avez spécifiquement de mettre en œuvre des méthodes, avec les mêmes signatures dans les deux MyAirplane
et PterodactylSuperJet
pour que votre code fonctionne correctement avec les deux. Si vous ou quelqu'un de changer l'interface d'une classe, votre flexibilité est cassé.
Exemple. Dites que vous n'avez pas l' Airplane
super-classe et une autre sans méfiance dev modifie la méthode
public void flyStraight()
en MyAirplane
de
public void flyStraight (int speed)
et supposons que votre plane
variable est de type MyAirplane
. Puis la code aurait besoin de quelques modifications; supposer que ce qui est nécessaire de toute façon. La chose est, si vous revenez à un PterodactylSuperJet
(par exemple, pour le tester, comparer, une pléthore de raisons), votre code ne sera pas exécuté. Whygodwhy. Parce que vous avez besoin pour fournir de l' PterodactylSuperJet
avec la méthode flyStraight(int speed)
vous n'avez pas écrit. Vous pouvez le faire, vous pouvez le réparer, c'est bien.
C'est un simple scénario. Mais que faire si
- Ce problème vous pique dans le cul d'un an après l'innocent modification? Vous pourriez même oublier pourquoi vous l'avez fait dans la première place.
- Pas un, mais une tonne de modificatios avait eu lieu que vous ne pouvez pas garder une trace de? Même si vous pouvez garder la trace, vous avez besoin pour obtenir la nouvelle classe jusqu'à la vitesse. Presque jamais facile et certainement jamais agréable.
- Au lieu de deux classes d'avions vous avez une centaine?
- Linéaire (ou non) une combinaison de ce qui précède?
Si vous aviez écrit un Airplane
de la superclasse et fait de chaque sous-classe de remplacer ses méthodes pertinentes, puis en changeant flyStraight()
de flyStraight(int)
en Airplane
vous seriez obligés de s'adapter à toutes les sous-classes en conséquence, par conséquent, de garder la cohérence. La flexibilité ne sera donc pas être modifié.
Fin edit
C'est pourquoi une super-classe reste comme une sorte de "papa" dans le sens que si une personne modifie son interface, toutes les classes vont suivre, par conséquent, votre code sera plus souple.