Tout en héritant d'une classe en C ++, l'utilisateur peut spécifier le spécificateur d'accès comme,
class Base
{
public int mem1;
protected in mem2;
};
class Derived1 : **private** Base
{
// mem1 will be private here.
// mem2 will be private here.
};
class Derived2 : **protected** Base
{
// mem1 will be protected here.
// mem2 will be protected here.
};
class Derived2 : **public** Base
{
// mem1 will be public here.
// mem2 will be protected here.
};
Mais la même chose n'est pas possible en Java, c'est-à-dire que l'extension en java est toujours comme l'héritage "public" en C ++.
Quelqu'un pourrait-il expliquer la raison de cela?
java
object-oriented
inheritance
Rumit Parakhiya
la source
la source
Réponses:
La plupart des avantages que l'héritage privé / protégé vous offre peuvent être facilement obtenus grâce à l'encapsulation. Thomas Eding a fourni de bons exemples de cas qui pourraient être rendus plus faciles avec l'ajout d'héritage privé / protégé, et bien qu'il s'agisse de cas valides, il existe des solutions de contournement qui ne nécessitent pas d'héritage privé / protégé et sont plus `` idiomatiques '' (en Java à moins).
Les développeurs du langage Java ont manifestement estimé que le coût en complexité nécessaire pour prendre en charge l'héritage privé / protégé (y compris l'héritage multiple) l'emportait sur l'avantage qu'il offrirait.
la source
B
comme uneA
(B
hérite en privé deA
) afin que vous puissiez l'utiliser polymorphiquement dans une méthode. Avec la composition, cela peut être fait, mais c'est beaucoup plus compliqué. Ici, vous devez créer une sous-classe distincteA'
(probablement une classe interne) qui implémente la fonctionnalité que vous utilisez. Vous devrez également déléguer manuellement les modifications à laB
classe parente (seB
faitA'
un ami,A'
accepte une référence àB
). Je suppose que ce n'est pas trop difficile à faire, mais cela entraîne un gâchis dans le code. (Suite)B
accéder aux variables protégées dansA
, l'héritage privé est à nouveau plus simple à implémenter sur la composition. Avec la composition, vous pouvez implémenter de laA'
même manière que ci-dessus, et / ou augmenter l'accès des variables protégées. (3) Supposons que vous souhaitiez une seule variable membre statique partagée qui soit la même variable exacte entre les instanciations du modèle. Une solution consiste à hériter en privé d'une classe de base non basée sur un modèle qui a le membre statique. La composition ne peut pas résoudre ce problème, bien que d'autres techniques puissent le faire (comme l'amitié d'une autre classe avec le membre).Comme Java n'a pas d'héritage multiple et que tout doit être (publiquement) hérité
Object
, il n'y a aucun endroit en Java où l'héritage privé ou protégé produirait un programme valide.la source