78 votes

Lorsque je surcharge une méthode, pourquoi puis-je augmenter l'accès mais pas le diminuer ?

Pourquoi Java spécifie-t-il que le spécificateur d'accès d'une méthode de remplacement peut autoriser plus, mais pas moins, d'accès que la méthode de remplacement ? Par exemple, une méthode d'instance protégée dans la superclasse peut être rendue publique, mais pas privée, dans la sous-classe.

12 votes

Pour utiliser la description commune : B extends A si B is-a A . Donc si A peut faire action() et B is-a A alors B devrait être en mesure de faire action() également.

0 votes

Qu'en est-il d'un A abstrait ?

88voto

Patrick87 Points 10305

C'est un principe fondamental de la POO : la classe enfant est une instance à part entière de la classe parent, et doit donc présenter au moins la même comme classe mère. Rendre les éléments protégés/publics moins visibles violerait cette idée ; vous pourriez rendre les classes enfants inutilisables en tant qu'instances de la classe mère.

0 votes

Puis-je vous joindre pour une question spécifique ?

0 votes

@Burk J'ai créé un salon de discussion "patrick87-burk-private-chat" où vous pouvez me joindre pour tout ce dont vous avez besoin. J'ai essayé de vous inviter mais si vous n'avez pas reçu d'invitation, vous devriez pouvoir la trouver.

39voto

Maurício Linhares Points 19468

Imaginez ces deux classes :

public class Animal {
  public String getName() { return this.name; }
}

public class Lion extends Animal {
  private String getName() { return this.name; }
}

Je pourrais écrire ce code :

Animal lion = new Lion();
System.out.println( lion.getName() );

Et il faudrait qu'elle soit valide, puisque sur Animal la méthode getName() est public, même s'il a été rendu privé sur Lion . Il n'est donc pas possible de rendre les choses moins visibles sur les sous-classes car une fois que vous avez une référence à la super-classe, vous pouvez accéder à ces choses.

3 votes

C'est l'objet du principe de substitution de Liskov.

10voto

Vineeth Bhaskaran Points 188

Prenons l'exemple suivant

 class Person{
 public void display(){
      //some operation
    }
 }

class Employee extends Person{
   private void display(){
       //some operation
   }
 }

Le remplacement typique se produit dans le cas suivant

Person p=new Employee();

Ici p est la référence de l'objet avec le type Personne(super classe) quand nous appelons p.display() . Comme le modificateur d'accès est plus restrictif, le référence à l'objet p ne peut pas accéder objet enfant de type Employee

9voto

Oli Charlesworth Points 148744

Parce que ça serait bizarre :

class A {
    public void blah() {}
}

class B extends A {
    private void blah() {}
}

B b = new B();
A a = b;
b.blah();  // Can't do it!
a.blah();  // Can do it, even though it's the same object!

0voto

João Fernandes Points 693

Parce qu'une sous-classe est une spécialisation de la super-classe, ou en d'autres termes, c'est une extension de la super-classe.

Imaginez par exemple la méthode toString. Tous les objets Java la possèdent car la classe Object en est dotée. Imaginez que vous puissiez définir une classe avec la méthode toString privée. Dans ce cas, vous ne traitez plus tous les objets de la même manière. Par exemple, vous ne seriez plus en mesure de le faire en toute sécurité :

for (Object obj : collection) System.out.println(obj);

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X