Почему защищенные и частные атрибуты доступны одному и тому же классу, а не одному и тому же объекту?

Например, у нас есть класс Man

Если Man.age защищен, то я не понимаю, почему chuckNorris (экземпляр класса Man) может изменить защищенный/частный атрибут age объекта jackBauer (другой экземпляр класса Man). Он не должен быть в состоянии сделать это (IMO).

На мой взгляд, значение атрибута protected/private должно принадлежать только самому объекту, а не классу...

Мне нужно какое-то объяснение, я думаю, я запутался.


person Matthieu Napoli    schedule 07.10.2010    source источник
comment
Ваши утверждения будут верны или нет в зависимости от языка программирования/платформы. О каком языке или платформе идет речь?   -  person CesarGon    schedule 07.10.2010
comment
Ява ? PHP? Есть ли разница?   -  person Matthieu Napoli    schedule 07.10.2010
comment
Я не знаком с PHP. Но я почти уверен, что между, скажем, Java, C++, Smalltalk и Eiffel есть различия в отношении доступа к членам.   -  person CesarGon    schedule 07.10.2010


Ответы (3)


Матье прав. cuckNorris может сделать jackBauer.age

Но с этим проблем нет. Если вы ссылаетесь на атрибуты экземпляра Man внутри Man, это означает, что вы кодируете класс Man, поэтому вы знаете, что делаете.

Проблема была бы в том, если бы вы передали мне этот класс Man, и я мог бы получить доступ к атрибутам Man, не зная, как закодирован класс Man.

Сеттеры и геттеры могут выполнять некоторую бизнес-логику, которую я не знаю, и мне это не нужно знать. Но тот, кто закодировал Мам, знает.

person David Ramentol    schedule 22.01.2012

Рассмотрим этот класс Java:

public class Base {
  private int a
  protected int b;

  public Base(int a,int b) {
    this.a = a;
    this.b = b;
  }

  public int getA() {
     return a;
  }

  public int getB() {
    return b;
  } 
}

...
 Base foo = new Base(1,2);
 Base bar = new Base(3,4);

Нет никакого способа (возможно, кроме как через грязное отражение), экземпляр foo может изменить защищенную или частную переменную в bar

Вы можете позволить это, если хотите,

public class Base {
  private int a
  protected int b;

  public Base(int a,int b) {
    this.a = a;
    this.b = b;
  }

  public int getA() {
     return a;
  }

  public int getB() {
    return b;
  } 
 public void changeB(int newB,Base other) {
   other.b = newB;
 }
}
... 
Base foo = new Base(1,2);
Base bar = new Base(3,4);
foo.changeB(5,bar);

Вы не можете защитить метод changeB от изменения содержимого объекта other [*], вам просто нужно быть осторожным с тем, что делает ваша программа. В некоторых языках вы могли бы пометить аргумент other как неизменяемый, но не в Java - я не считаю это большой проблемой.

[*} Вы могли бы, пометив все поля Base как окончательные, хотя тогда даже сам экземпляр не мог бы изменить члены после создания объекта.

person nos    schedule 08.10.2010
comment
Ок спасибо понятно. И я думаю, что это просто странно, что foo может изменить bar.b, даже если b является приватным. Я имею в виду, что private должен быть связан с экземпляром, а не с классом. - person Matthieu Napoli; 09.10.2010

Частный атрибут доступен только методу в классе. Защищенный атрибут доступен только в классе-потомке. Поэтому объект jackbauer не может модифицировать что-либо приватное или защищенное в объекте chuckNorris класса Man. Надеюсь, это поможет

person enokd    schedule 07.10.2010
comment
Вы говорите, что частный атрибут доступен только методом в классе, тогда, если jackBauer и chuckNorris являются объектами класса Man, тогда они могут совместно использовать частные атрибуты?? - person Matthieu Napoli; 07.10.2010
comment
В этом случае это будет атрибут класса, который является общим для всех объектов класса. Эти атрибуты разработаны словом static. - person enokd; 08.10.2010
comment
Нет, я не говорю о статических атрибутах, говоря, что внутри объекта chuckNorris я могу сделать: jackBauer.age. И я думаю, что это странно, потому что это частные атрибуты, поэтому другие объекты не должны иметь возможность читать или изменять их. Я ошибся ? - person Matthieu Napoli; 08.10.2010
comment
Не могли бы вы привести пример кода? Вы не можете сделать это, если у вас нет общедоступной функции установки для возраста. - person enokd; 08.10.2010