Re[3]: Разве к protected-члену нельзя обращаться из наследни
От: _PiT_ Россия ICQ: 68909455
Дата: 31.08.06 07:20
Оценка: 2 (1)
Здравствуйте, Аноним, Вы писали:

_PT>>ты пытаешься обратиться к protected полю класса Sequence.

_PT>>a доступ к protected полям возможен только из классов наследников класса Sequence.
А>так класс Number и есть наследник класса Sequence

http://java.sun.com/docs/books/jls/second_edition/html/names.doc.html#62587
A protected member or constructor of an object may be accessed from outside the package in which it is declared only by code that is responsible for the implementation of that object.


переменная seq имеет тип Sequence. сама переменная seq не ответственна за расширение класса Sequence.

если класс Number будет реализован в другом пакете, нежели класc Sequence, то доступ к protected полям переменной типа Sequence из класса Number будет запрещён.
Твой учитель — это не тот, кто тебя учит, а тот, у кого учишься ты
(c) Записная книжка Дональда Шимоды
Re: Разве к protected-члену нельзя обращаться из наследника!
От: bolshik Россия http://denis-zhdanov.blogspot.com/
Дата: 31.08.06 07:50
Оценка: 1 (1)
Здравствуйте, dims12, Вы писали:

D>Мне всегда казалось, что объявление члена protected делает его доступным из своего пакета и из наследника. Так?


D>?


Все правильно. Ты немного не так понимаешь смысл protected. При создании любого объекта на самом деле создаются объекты всех его суперклассов, и из класса-потомка можно обращаться только к protected-членам объекта суперкласса, созданного вместе с объектом класса-потомка. В твоем примере ты передаешь другой объект класса-предка ==> получаешь ошибку компиляции.
http://denis-zhdanov.blogspot.com
Разве к protected-члену нельзя обращаться из наследника!?
От: dims12 http://www.relativity.ru
Дата: 31.08.06 01:56
Оценка:
Мне всегда казалось, что объявление члена protected делает его доступным из своего пакета и из наследника. Так?

А почему тогда вот так не работает


public class Sequence extends Token {

  protected TokenChain core = new TokenChain();

  // создание пустой цепочки
  public Sequence() {
  }

  //...
}

public class Number extends Sequence {
  private Number(Sequence seq) {
    core = seq.core; // почему-то тут выдаёт ошибку на второй core, говоря, что он protected
  }
  // ...
}


?
Re: Разве к protected-члену нельзя обращаться из наследника!
От: dims12 http://www.relativity.ru
Дата: 31.08.06 02:03
Оценка:
Решилось таким трюком:

public class Sequence extends Token {

  protected TokenChain core = new TokenChain();

  // создание пустой цепочки
  public Sequence() {
  }

  // задание содержимого цепочки из другого объекта
  protected void assign(Sequence seq) {
    core = seq.core;
  }

  //...
}

public class Number extends Sequence {
  private Number(Sequence seq) {
    assign(seq);
  }
  //...
}



Не пойму, в чём идеологическая разница? Почему к protected-члену обратиться нельзя, а к protected-методу -- можно?

И вообще. Сейчас просто конструктор дополнительный к Sequence присобачу...
Re: Разве к protected-члену нельзя обращаться из наследника!
От: Аноним  
Дата: 31.08.06 06:31
Оценка:
Здравствуйте, dims12, Вы писали:

D>Мне всегда казалось, что объявление члена protected делает его доступным из своего пакета и из наследника. Так?


D>А почему тогда вот так не работает


...


Твой пример отлично компилируется и никто не ругается (jdk 1.4.2_10)
Re: Разве к protected-члену нельзя обращаться из наследника!
От: _PiT_ Россия ICQ: 68909455
Дата: 31.08.06 06:42
Оценка:
Здравствуйте, dims12, Вы писали:

D>Мне всегда казалось, что объявление члена protected делает его доступным из своего пакета и из наследника. Так?


D>А почему тогда вот так не работает



D>
D>public class Sequence extends Token {

D>  protected TokenChain core = new TokenChain();

D>  // создание пустой цепочки
D>  public Sequence() {
D>  }

D>  //...
D>}

D>public class Number extends Sequence {
D>  private Number(Sequence seq) {
D>    core = seq.core; // почему-то тут выдаёт ошибку на второй core, говоря, что он protected
D>  }
D>  // ...
D>}

D>

ты пытаешься обратиться к protected полю класса Sequence.
a доступ к protected полям возможен только из классов наследников класса Sequence.

правило protected доступа: http://java.sun.com/docs/books/jls/second_edition/html/names.doc.html#62587
пример: http://java.sun.com/docs/books/jls/second_edition/html/names.doc.html#36191
Твой учитель — это не тот, кто тебя учит, а тот, у кого учишься ты
(c) Записная книжка Дональда Шимоды
Re: Разве к protected-члену нельзя обращаться из наследника!
От: Polosatiy  
Дата: 31.08.06 06:51
Оценка:
Всё отлично работает
JDK 1.5.0_08
Re[2]: Разве к protected-члену нельзя обращаться из наследни
От: _PiT_ Россия ICQ: 68909455
Дата: 31.08.06 06:51
Оценка:
забыл сказать, классы само собой должны быть в одном пакете.
Твой учитель — это не тот, кто тебя учит, а тот, у кого учишься ты
(c) Записная книжка Дональда Шимоды
Re[2]: Разве к protected-члену нельзя обращаться из наследни
От: Аноним  
Дата: 31.08.06 07:02
Оценка:
_PT>ты пытаешься обратиться к protected полю класса Sequence.
_PT>a доступ к protected полям возможен только из классов наследников класса Sequence.
так класс Number и есть наследник класса Sequence
Re: Разве к protected-члену нельзя обращаться из наследника!
От: dims12 http://www.relativity.ru
Дата: 31.08.06 16:37
Оценка:
У меня, забыл написать, классы находятся в разных пакетах.

Да, _PiT_ всё правильно написал, в этом, как кажется, и должно быть дело.

Тут различие не в том, к методу я обращаюсь или к простому члену, а в том, КАК я к нему обращаюсь. Когда я получаю предка через аргумент функции, то я мог бы сделать с ним всякие нехорошие вещи, которые не были бы отражены в интерфейсе. А когда я обращаюсь к предку на котором сам основан, то я имею право делать с ним всё, что не запрещено, так как в этом будет заключаться переопределение при наследовании.

То есть, правило надо уточнить:

protected допускает, чтобы к методу или члену можно было полностью обращаться из своего пакета и с ограничениями обращаться из чужого пакета из наследника. а именно, наследник может обращаться к protected членам и методам СВОЕГО (this, super) предка, но не может обращаться таким же членам тех объектов, которые он получил извне.

Кажется, это ещё одно тонкое отличие от Си++, так как там такое, как мне кажется, разрешено.
Re[2]: Разве к protected-члену нельзя обращаться из наследни
От: dshe  
Дата: 01.09.06 07:23
Оценка:
Здравствуйте, dims12, Вы писали:

D>У меня, забыл написать, классы находятся в разных пакетах.


D>Да, _PiT_ всё правильно написал, в этом, как кажется, и должно быть дело.


D>Тут различие не в том, к методу я обращаюсь или к простому члену, а в том, КАК я к нему обращаюсь. Когда я получаю предка через аргумент функции, то я мог бы сделать с ним всякие нехорошие вещи, которые не были бы отражены в интерфейсе. А когда я обращаюсь к предку на котором сам основан, то я имею право делать с ним всё, что не запрещено, так как в этом будет заключаться переопределение при наследовании.


D>То есть, правило надо уточнить:


D>protected допускает, чтобы к методу или члену можно было полностью обращаться из своего пакета и с ограничениями обращаться из чужого пакета из наследника. а именно, наследник может обращаться к protected членам и методам СВОЕГО (this, super) предка, но не может обращаться таким же членам тех объектов, которые он получил извне.


D>Кажется, это ещё одно тонкое отличие от Си++, так как там такое, как мне кажется, разрешено.


В C++, как мне кажется, такая же история. По крайней мере msdev 2003
struct A {
protected:
    void func() {}
};

struct B: A {
public:
    void x(A &a) {
        func();
        a.func(); // error C2248: 'A::func' : cannot access protected member declared in class 'A'
    }
};
--
Дмитро
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.