Je comprends que dans les classes abstraites, les méthodes soient abstraites ou non. Mais pourquoi ne puis-je pas créer une méthode abstraite dans une classe "normale", non abstraite?
Merci d'avance pour toute explication!
Résumé méthode dit en gros qu'il n'y a pas de mise en oeuvre de la méthode et qu'elle doit être implémentée dans une sous-classe . Cependant, si vous aviez une méthode abstract dans une classe non-abstract , vous pouvez instancier la classe et obtenir un objet qui aurait une méthode non implémentée, que vous ne pourriez pas appeler.
Commençons par comprendre pourquoi nous avons besoin de quelque chose comme une méthode abstraite . La réponse est simple Je ne veux pas que mes extenders utilisent mes méthodes telles quelles, je veux qu’ils définissent leur propre comportement d’une méthode particulière. Depuis que j'utilise cette méthode dans d'autres méthodes de ma classe abstraite. Je peux fournir un / ** doc Java ** / sur la classe abstraite et leur indiquer comment utiliser un comportement par défaut.
class abstract LoveTheWorld {
private int myKindness ;
public int defaultGiveKindness() {
myKindness -= 5 ;
return 5 ;
}
/**
you can use the defaultGiveKindness method, and not define your own behavior
**/
public abstract int giveKindness() ;
}
Cela indique également aux extender qu'ils peuvent étendre une seule classe (selon les règles d'héritage Java). Maintenant, si vous voulez déformer cette histoire, vous pouvez utiliser l'interface au lieu d'une classe abstraite. Mais tout dépend de quelles contraintes voulez-vous que votre futur développeur adhère, strictes ou flexibles . Strict le maintiendra serré et garantira la réduction des erreurs, flexible le maintiendra lâche et libre et favorisera l'innovation. La question est ** de quoi avez-vous besoin * 8.
L'utilisation d'une méthode abstraite empêche l'instanciation d'une classe, ce qui en fait une classe abstraite de facto. Java insiste pour que vous déclariez explicitement ce fait par souci de cohérence: techniquement, le compilateur Java n'a pas besoin de cette marque supplémentaire pour décider si une classe est abstraite en fonction de la présence de méthodes abstraites, aucune de ses méthodes abstraites, nécessitant la déclaration sur la classe était la voie à suivre.
Vous voulez appeler une méthode fournissant une implémentation, c'est l'essence de la programmation.
Sur la base de cette idée, les règles Java sont les suivantes:
Et si Java vous permettait d'appeler une méthode sur une instance d'une classe non abstraite avec ... aucune implémentation, puisque méthode serait abstract
=> aucun sens du tout.
C'est pourquoi Java et tous les autres langages utilisant un mécanisme similaire, tel que C # (méthode virtuelle), empêchent de déclarer une méthode abstraite dans une classe non abstraite.
Si une classe concrète pouvait avoir une méthode abstraite, vous ne pourriez pas créer d'objet à partir de celle-ci. Imaginez une Shape
avec une méthode concrète getColor()
et une méthode abstraite draw()
. Il est bon de se référer à certaines choses de manière abstraite, afin que quelqu'un puisse vous dire "rendre une forme!":
public void render(Shape s) { ... }
Mais lorsque vous utilisez cette référence pour appeler draw()
, vous vous attendez à ce que l'objet référencé par s
sache comment procéder:
s.draw();
Si les classes concrètes pouvaient utiliser des méthodes abstraites, vous pourriez instancier un objet Shape, mais lorsque vous appelez la méthode draw, il ne saurait pas quoi dessiner! Même s'il savait dire sa couleur, sa position ou 1000 autres choses. Si ce n'est pas spécifié à 100%, il ne peut pas exister en tant qu'objets de travail.
Donc, Java exige que ces classes soient marquées comme abstraites. Dans ce cas, vous ne pourrez pas les utiliser pour créer des objets, car ils ne savent pas comment faire concrètement à 100% tout ce que vous attendez de l'objet. Vous ne pouvez utiliser que des classes abstraites pour y faire référence. Vous pouvez être sûr maintenant que seules les classes ayant toutes leurs méthodes implémentées seront utilisées pour créer des objets, et elles auront probablement des noms qui semblent aussi moins abstraits:
Shape shape = new Rectangle();
render(shape);
Maintenant, vous pouvez dire "rendre la forme" et votre programme, en utilisant la référence au rectangle, saura comment draw()
.
les méthodes abstraites sont destinées à laisser l'implémentation aux classes enfants.Si la classe normale contient une méthode abstraite, on peut alors créer l'objet pour cette classe et appeler la méthode abstraite comme une méthode normale.Le problème se posera alors. raison, les méthodes abstraites doivent être dans la classe abstraite (de sorte que l'on ne puisse pas créer l'objet pour la classe abstraite) ou dans les interfaces uniquement.
La réponse est simple: si la classe n'est pas abstraite (concreate), vous pouvez instancier cette classe et appeler n'importe quelle méthode de cette classe. méthode abstraite particulière (pour éviter cela, nous ne pouvons pas déclarer des méthodes abstraites dans une classe non abstraite)
Parce qu'avoir une méthode abstraite en fait une classe abstraite. Le raisonnement est circulaire.