2010-11-30 5 views
7

Dans this thread j'ai trouvé un moment intéressant, Si classe utilise uniquement comme superclasse il n'y a pas de règle pour le rendre abstrait. Pourquoi ça?Dans quels cas la superclasse ne devrait pas être abstraite?

Merci

+0

duplicata possible de [pourquoi java.lang.Throwable n'est pas une classe abstraite?] (Http://stackoverflow.com/questions/4306214/why-isnt-java-lang-throwable-an-abstract-class) – EJP

Répondre

9

Tout dépend si oui ou non il est logique d'avoir des instances de la classe. Supposons par exemple que vous ayez une classe Dog et une classe Cat

Ils s'étendent tous les deux Animal. Maintenant, un Animal peut avoir un nom et quelques méthodes, mais cela n'a aucun sens d'avoir Animal en cours d'exécution. Un Animal est ... bien une notion abstraite.

Dans d'autres circonstances, vous pouvez avoir des sous-classes (par exemple le LinkedHashSet étend HashSet), mais il fait encore beaucoup de sens pour instancier la classe super (HashSet dans ce cas).


Pour répondre à votre commentaire, « Est-il logique de faire une classe non abstraite, même si vous ne voulez pas instancier. »

Eh bien, je dirais que si vous, aujourd'hui, tout simplement ne connaissent pas de cas d'utilisation dans lesquels il devrait être instancié, la même règle s'applique: Est-ce logique (logiquement) d'avoir une instance de la classe? Si c'est le cas, rendez-le non abstrait. Si la situation ressemble plus à "Si vous avez créé une instance de cette classe, vous vous trompez probablement!" alors je clarifierais ceci en faisant abstraction de la classe.

+0

Yeap, merci. Bur Je suis toujours intéressant, y a-t-il des cas où nous utilisons des classes non abstraites mais ne créons pas ses instances? –

+1

Eh bien, la pensée la plus proche que je puisse penser est lorsque vous utilisez le modèle singleton. Vous ne voulez ensuite créer aucune instance après avoir créé une instance unique. Dans de tels cas, vous rendez généralement le constructeur privé pour éviter de créer d'autres instances. – aioobe

+0

Merci pour la réponse. –

1

Si la classe est complète et utilisable, il est logique que vous soyez capable d'instancier et d'utiliser la classe, même si l'utilisateur décide de l'étendre plus tard.

La classe ne doit être abstraite que si l'utilisateur doit implémenter une logique pour la rendre fonctionnelle dans le cadre dans lequel elle est utilisée, c'est-à-dire lorsque le concepteur de classe ne connaît pas les détails d'implémentation de la classe , comme le modèle ou les modèles de conception de commande par exemple.

+0

Merci pour votre deuxième paragraphe. C'est bon pour clarifier. La question est pourquoi vous pensez ainsi? –

4

À partir de @aioobe - Pensez à la situation suivante.

Dans une entreprise, vous avez une position appelée Comptable. Maintenant, supposons que vous avez quelqu'un qui se spécialise dans auditant, et nous disons que son titre est Auditor. Maintenant, l'entreprise compte 100 comptables, mais seulement 4 auditeurs. Dans ce cas, vous voulez instancier à la fois le comptable et vérificateur cours, même si comptable est un super-classe de vérificateur.

+0

Ouais. Mais dans ce cas, «comptable» utilise non seulement comme une super-classe. –

+0

@Stas - Aaah, je vois ce que tu veux dire. Désolé, n'a pas pu faire la question. Dans ce cas, je suis d'accord avec le message de @aioobe. On dirait qu'il l'a bien compris. –

+0

Impossible de créer une variable d'instance 'specialties' qui contienne le rôle' Auditing'? Si un «comptable» existant devient un vérificateur, vous pouvez simplement appeler la méthode 'addSpecialty()'. – Eva

Questions connexes