Pourquoi Java ne prend pas en charge l'héritage privé / protégé comme C ++? [fermé]


12

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?


16
On n'a pas besoin d'une raison pour omettre une fonctionnalité, il faut une raison (idéalement, plusieurs bonnes) pour l'ajouter.

1
Cela ne peut être répondu que spéculativement, en votant pour fermer.
Jimmy Hoffa

Réponses:


10

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.


1
Il convient de noter qu'en C ++, il existe des différences importantes entre l'héritage privé et l'inclusion en tant que membre, mais elles tournent autour de l'ordre d'initialisation et de l'héritage multiple et ne se traduisent donc pas dans le système d'objets plus simple de Java.
Jan Hudec

2
-1: " Tout avantage que l'héritage privé / protégé vous offre peut être facilement obtenu grâce à l'encapsulation." Faux. Je serais d'accord avec " La plupart des avantages ..."
Thomas Eding

@ThomasEding Pouvez-vous donner un exemple de quelque chose qui peut être réalisé grâce à l'héritage privé / protégé mais pas par l'encapsulation (ou au moins quelque chose qui nécessiterait beaucoup de travail à accomplir avec l'encapsulation)? Honnêtement, je ne peux pas penser à un, mais je suis ouvert à être convaincu.
pswg

2
Oups, désolé pour ça. Voici quelques exemples en C ++. (1) Supposons que vous vouliez considérer en interne la classe Bcomme une A( Bhérite en privé de A) 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 distincte A'(probablement une classe interne) qui implémente la fonctionnalité que vous utilisez. Vous devrez également déléguer manuellement les modifications à la Bclasse parente (se Bfait A'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)
Thomas Eding

2
... (2) Si vous souhaitez Baccéder aux variables protégées dans A, l'héritage privé est à nouveau plus simple à implémenter sur la composition. Avec la composition, vous pouvez implémenter de la A'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).
Thomas Eding

9

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.

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.