Здравствуйте, Аноним, Вы писали:
_PT>>ты пытаешься обратиться к protected полю класса Sequence. _PT>>a доступ к protected полям возможен только из классов наследников класса Sequence. А>так класс Number и есть наследник класса Sequence
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-члену нельзя обращаться из наследника!
Здравствуйте, dims12, Вы писали:
D>Мне всегда казалось, что объявление члена protected делает его доступным из своего пакета и из наследника. Так?
D>?
Все правильно. Ты немного не так понимаешь смысл protected. При создании любого объекта на самом деле создаются объекты всех его суперклассов, и из класса-потомка можно обращаться только к protected-членам объекта суперкласса, созданного вместе с объектом класса-потомка. В твоем примере ты передаешь другой объект класса-предка ==> получаешь ошибку компиляции.
Мне всегда казалось, что объявление члена 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-члену нельзя обращаться из наследника!
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-члену нельзя обращаться из наследника!
Здравствуйте, 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.
забыл сказать, классы само собой должны быть в одном пакете.
Твой учитель — это не тот, кто тебя учит, а тот, у кого учишься ты
(c) Записная книжка Дональда Шимоды
Re[2]: Разве к protected-члену нельзя обращаться из наследни
От:
Аноним
Дата:
31.08.06 07:02
Оценка:
_PT>ты пытаешься обратиться к protected полю класса Sequence. _PT>a доступ к protected полям возможен только из классов наследников класса Sequence.
так класс Number и есть наследник класса Sequence
Re: Разве к protected-члену нельзя обращаться из наследника!
У меня, забыл написать, классы находятся в разных пакетах.
Да, _PiT_ всё правильно написал, в этом, как кажется, и должно быть дело.
Тут различие не в том, к методу я обращаюсь или к простому члену, а в том, КАК я к нему обращаюсь. Когда я получаю предка через аргумент функции, то я мог бы сделать с ним всякие нехорошие вещи, которые не были бы отражены в интерфейсе. А когда я обращаюсь к предку на котором сам основан, то я имею право делать с ним всё, что не запрещено, так как в этом будет заключаться переопределение при наследовании.
То есть, правило надо уточнить:
protected допускает, чтобы к методу или члену можно было полностью обращаться из своего пакета и с ограничениями обращаться из чужого пакета из наследника. а именно, наследник может обращаться к protected членам и методам СВОЕГО (this, super) предка, но не может обращаться таким же членам тех объектов, которые он получил извне.
Кажется, это ещё одно тонкое отличие от Си++, так как там такое, как мне кажется, разрешено.
Re[2]: Разве к protected-члену нельзя обращаться из наследни
Здравствуйте, 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'
}
};