Java, Impossible de réduire la visibilité de la méthode héritée de l'objet
Continue à partir de cette question: Pourquoi ne pouvez-vous pas réduire la visibilité d'une méthode dans une sous-classe Java?
J'ai besoin de créer une classe B
qui est presque identique à la classe A
sauf que B
ne peut pas faire certaines choses que A
peut.
Être un paresseux programmeur que je suis, j'ai essayé d'hériter A
seulement pour saluer avec l'erreur que B
ne peut pas réduire la visibilité de A
méthodes. Duh!..
Maintenant A
est une API à partir d'un fournisseur, mon intention est d'encapsuler cette API, de sorte qu'il est plus facile à utiliser.
Je me demande quelle est la meilleure pratique pour contourner cela?
source d'informationauteur Rosdi Kasim
Vous devez vous connecter pour publier un commentaire.
Deux options:
Si vous avez besoin d'
B
de garder la même interface queA
(ainsi que le code client peut utiliser l'un des deux sans modifications), vous pouvez remplacer "interdit" méthodes enB
et de les avoir jeter unUnsupportedOperationException
. Par exemple:Ou, si vous voulez vraiment l'API de
B
être un sous-ensemble de l'API deA
puis justeB
contenir une instance deA
et de déléguer les appels de méthode appropriée.Utilisation Composition plutôt que de l'Héritage.
c'est à dire de la classe B contient une référence à une classe A et en interne, les appels de méthodes sur elle.
Une façade est utilisée lorsque l'on veut une plus facile ou interface plus simple de travailler avec.
Vous devez créer votre propre classe wrapper (Façade Modèle) autour de votre interface.
La mise en œuvre serait alors une instance de l'Étranger qu'il peut renvoyer les appels.
Vous pouvez créer une classe wrapper offrant une réduction de l'API, ou vous pouvez lancer une exception comme
UnsupportedOperationException
le fait que les méthodes que vous souhaitez désactiver.Si B ne peut pas faire tout chose, vous ne pouviez pas traiter B comme A.
Peut-être vous avez besoin d'un wrapper, pas un subclasse.
EDIT:
Donc, si vous voulez comprendre, vous ne serez jamais à réduire la "visibilité" d'une sous-classe de la méthode :). Lever une exception, ou ne rien faire n'est pas de réduire la visibilité, donc vous avez besoin d'un wrapper. Parfois, cette situation est un signal d'une mauvaise conception (seulement parfois).
C'est très liée à cercle ellipse problème.
La solution serait probablement utiliser la "composition" plus "inhertence".
Vous pourriez avoir une propriété dans la classe B, de type A. les exposer uniquement les méthodes de B que vous souhaitez réellement mettre en œuvre
Une autre option que vous pourriez envisager.
Dites que vous voulez réduire l'API de la classe:
Tels que les clients ne seraient exposés à-dire la doFoo de la méthode (ou n'importe quelle méthode que vous préférez à utiliser à la place):
Mais pour que les instances de la ReducedApi être utilisé n'importe où le LargeApi est prévu, vous avez besoin d'un moyen de revenir à la LargeApi (de préférence sans casting):
Un exemple de mise en œuvre de forcer les clients à utiliser votre nouveau réduit API pourrait ressembler à l'exemple suivant:
Maintenant, vos clients peuvent utiliser votre réduction de l'api pour le cas courant, mais les acteurs de la grande api en cas de besoin:
Je voudrais utiliser l'adaptateur. http://en.wikipedia.org/wiki/Adapter_pattern