Définition d'une classe abstraite sans aucune méthode abstraite


114

Puis-je définir une classe abstraite sans ajouter de méthode abstraite?


1
Un bon exemple peut être trouvé dans le modèle décorateur, voir ici . Les deux WindowDecoratoret CoffeeDecoratorsont des abstractclasses, mais aucun ne comprend une abstractméthode.
MS Dousti

Réponses:


168

Bien sûr.

Déclarer un résumé de classe signifie uniquement que vous ne l'autorisez pas à être instancié seul.

Déclarer un résumé de méthode signifie que les sous-classes doivent fournir une implémentation pour cette méthode.

Les deux sont des concepts séparés, bien que vous ne puissiez évidemment pas avoir de méthode abstraite dans une classe non abstraite. Vous pouvez même avoir des classes abstraites avec des finalméthodes, mais jamais l'inverse.


14

Oui tu peux le faire. Pourquoi tu n'essaies pas de faire ça?


6
Et ce n'est pas seulement le PO. Regardez tous les votes positifs que la question a obtenus!
Marc W

54
@ karim79 Il n'y a pas besoin de chevaux hauts et de tout ce truc de sauce. L'essayer ne révèle pas tout à fait pourquoi il est autorisé, tout en le demandant.
biziclop

7
@bizclop - L'essayer par lui-même aurait pu aboutir à une question plus productive. Il n'y a pas de grands chevaux. C'est assez simple. Sa question était «Puis-je» plutôt que «Pourquoi cela ...».
karim79

8
S'il est possible de répondre à la question par un simple oui ou non, le demandeur doit envisager de reformuler, d'utiliser Google ou simplement de l'essayer.
Tyler Treat le

3
@ karim79 Oui, la question aurait pu être mieux formulée, mais je suppose qu'il ne faut pas beaucoup d'efforts pour regarder un pas en avant.
biziclop

8

Oui, vous pouvez. La classe abstraite utilisée dans java signifie que vous ne pouvez pas créer un objet de la classe. Et une méthode abstraite que les sous-classes doivent fournir une implémentation pour cette méthode.

Ainsi, vous pouvez facilement définir une classe abstraite sans aucune méthode abstraite.

Comme par exemple :

public abstract class AbstractClass{

    public String nonAbstractMethodOne(String param1,String param2){
        String param = param1 + param2;
        return param;
    }

    public static void nonAbstractMethodTwo(String param){
        System.out.println("Value of param is "+param);
    }
}

C'est bon.


6

OUI Vous pouvez créer une classe abstraite sans aucune méthode abstraite le meilleur exemple de classe abstraite sans méthode abstraite est HttpServlet La
méthode abstraite est une méthode qui n'a pas de corps, Si vous avez déclaré au moins une méthode dans la classe, la classe doit être déclarée comme une abstract c'est obligatoire MAIS si vous avez déclaré la classe abstraite, il n'est pas obligatoire de déclarer la méthode abstraite à l'intérieur de la classe.

Vous ne pouvez pas créer d'objets de classe abstraite, ce qui signifie qu'il ne peut pas être instancié.


4

Oui, vous pouvez déclarer une classe que vous ne pouvez pas instancier seule avec uniquement des méthodes qui ont déjà des implémentations. Cela serait utile si vous souhaitez ajouter des méthodes abstraites à l'avenir, ou si vous ne souhaitez pas que la classe soit directement instanciée même si elle n'a pas de propriétés abstraites.


La question ne concernait pas les classes abstraites vides, juste des classes abstraites sans méthodes abstraites. Il n'y a aucune raison valable pour autant que je puisse voir pour utiliser une classe abstraite complètement vide.
biziclop

1
Réponse fixe. L'utilisation d'une classe abstraite vide peut être utile si vous avez de bonnes raisons de vouloir ajouter des méthodes abstraites plus tard et de ne pas avoir à refactoriser d'autres classes parentes.
Gordon Gustafson

1
Au milieu d'une hiérarchie, une classe abstraite complètement vide (sauf pour la spécification d'héritage) peut avoir un sens si les dérivations de cette classe auront des obligations contractuelles différentes de celles des autres dérivations du parent.
supercat du

3

oui, nous pouvons déclarer une classe abstraite sans aucune méthode abstraite. le but de déclarer une classe comme abstraite n'est pas d'instancier la classe.

donc deux cas

1) classe abstraite avec des méthodes abstraites.

ces types de classes, nous devons hériter d'une classe de cette classe abstraite et remplacer les méthodes abstraites de notre classe, ex: classe GenricServlet

2) classe abstraite sans méthodes abstraites.

ces types de classes, nous devons hériter d'une classe de cette classe abstraite, ex: le but de la classe HttpServlet est de faire bien que si vous n'implémentez pas votre logique dans la classe enfant, vous pouvez obtenir la logique parent

veuillez vérifier le code source HttpServlet


2

Oui, nous pouvons avoir une classe abstraite sans méthodes abstraites car les deux sont des concepts indépendants. Déclarer une classe abstraite signifie qu'elle ne peut pas être instanciée seule et ne peut être que sous-classée. Déclarer un résumé de méthode signifie que la méthode sera définie dans la sous-classe.


Pourquoi ne voudrais-je pas que la classe ne puisse pas être instanciée? Une bonne raison, par exemple?
karlihnos

1

Oui, tu peux faire ça.

déclarer une classe abstraite signifie que la classe ne sera instanciée par aucune autre classe.

et il devrait y avoir au moins une méthode abstraite à l'intérieur et la signification de cela, vous pouvez déclarer une méthode abstraite dans cette classe si vous ne déclarez pas de méthode que son ok.

exemple:

public abstract class abs {

    protected int cx = 0, cy = 0;

    public void p() {
        System.out.print("hello");
    }
}

cela fonctionnera à coup sûr.


1

Oui, vous pouvez. Parfois, on vous pose cette question: quel est le but de cela? La réponse est: parfois, nous devons empêcher la classe d'instancier d'elle-même. Dans ce cas, nous voulons que l'utilisateur étende notre classe abstraite et instancie la classe enfant


1

Oui, vous pouvez définir une classe abstraite sans méthode abstraite. Cependant, s'il n'y a pas de méthode à l'intérieur, vous feriez mieux d'utiliser une interface


4
Bonne idée pour prendre la limite minimale de 30 caractères.
Marc W

1
S'il n'y a pas de méthode abstraite, comment une interface peut-elle être utilisée? L'interface a toutes les méthodes abstraites par défaut.
Usman Rana

1

Vous pouvez, la question dans mon esprit est plus si vous. Dès le début, je dirai qu'il n'y a pas de réponse dure et rapide. Faites ce qui convient à votre situation actuelle.

Pour moi, l'héritage implique une relation «est-un». Imaginez une classe de chien, qui peut être étendue par des sous-types plus spécialisés (Alsacien, Caniche, etc.). Dans ce cas, faire un résumé de la classe de chien peut être la bonne chose à faire puisque les sous-types sont des chiens. Imaginons maintenant que les chiens aient besoin d'un collier. Dans ce cas, l'héritage n'a pas de sens: il est absurde d'avoir une relation «est-un» entre les chiens et les colliers. C'est définitivement une relation «has-a», le collier est un objet collaboratif. Rendre le collier abstrait juste pour que les chiens puissent en avoir un n'a pas de sens.

Je trouve souvent que les classes abstraites sans méthodes abstraites expriment vraiment une relation «has-a». Dans ces cas, je trouve généralement que le code peut être mieux factorisé sans utiliser l'héritage. Je trouve également que les classes abstraites sans méthode abstraite sont souvent une odeur de code et devraient à tout le moins conduire à soulever des questions lors d'une révision de code.

Encore une fois, c'est entièrement subjectif. Il peut bien y avoir des situations où une classe abstraite sans méthodes abstraites a du sens, cela dépend entièrement de l'interprétation et de la justification. Prenez la meilleure décision pour tout ce sur quoi vous travaillez.


1

En fait, il n'y a aucun moyen si une classe abstraite n'a pas de méthode abstraite. Une classe abstraite est comme un père. Ce père a des propriétés et des comportements, quand, en tant qu'enfant, vous voulez être un enfant du père, le père dit que l'enfant (vous) doit être ainsi, c'est notre MOTO, et si vous ne voulez pas faire, vous ne sont pas mon enfant.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.