задачка скорее извращенная, чем сложная (может она даже здесь пробегала):
<blockquote><font size="1" face="Arial, Verdana, Helvetica, sans-serif">code:</font><hr><pre>
public class B
{
public int b1;
protected int b2;
private int b3;
public void TestAccess(B x)
{
x.b1 = 1;
x.b2 = 2;
x.b3 = 3;
}
}
</pre><hr></blockquote>
какие строки метода TestAccess сработают нормально, а какие вызовут ошибку? Объяснить зачем и почему.
(на интервью еще можно спросить какая будет ошибка или что произойдет, если параметр метода будет определен как предок или потомок B...)
язык - c#, c++, java (не smalltalk)
уверен, что половина сиджавников тут уже знает ответ - дайте, пожалуйста, поразвлекаться другой половине.
доступ к элементам класса
-
- Уже с Приветом
- Posts: 242
- Joined: 03 Jan 2000 10:01
- Location: TX > MA/NH > NJ/NYC
-
- Уже с Приветом
- Posts: 753
- Joined: 18 Sep 2000 09:01
- Location: Fremont, CA
доступ к элементам класса
ошибок доступа быть не должно.
если параметр (класс) будет объявлен как наследник B, то будет зависить от типа наследования (если public, то без ошибок, если private, то к private членам доступа не будет).
непонятно в чем тут проблема вообще? класс всегда является другом сам себе, и область видимости его членов внутри самого себя всегда одна и та же.
если параметр (класс) будет объявлен как наследник B, то будет зависить от типа наследования (если public, то без ошибок, если private, то к private членам доступа не будет).
непонятно в чем тут проблема вообще? класс всегда является другом сам себе, и область видимости его членов внутри самого себя всегда одна и та же.
-
- Уже с Приветом
- Posts: 753
- Joined: 18 Sep 2000 09:01
- Location: Fremont, CA
доступ к элементам класса
да, забыл сказать - это я все с точки зрения C++ говорил. в джавах не силен и даже не знаю есть ли там друзья у классов.
-
- Новичок
- Posts: 86
- Joined: 27 Feb 2001 10:01
- Location: Omsk , Russia
доступ к элементам класса
А как насчет вот этого ?
class B
{
public :
int b1;
void TestAccess(B x)
{
x.b1 = 1;
x.b2 = 2;
x.b3 = 3;
x.TestAccess(x) ;
printf ("b1=%d\nb2=%d\nb3=%n ",x.b1,x.b2,x.b3);
}
protected :
int b2;
private :
int b3;
};
void main()
{
B bb;
bb.TestAccess(bb);
}
Компилится , но не работает .
class B
{
public :
int b1;
void TestAccess(B x)
{
x.b1 = 1;
x.b2 = 2;
x.b3 = 3;
x.TestAccess(x) ;
printf ("b1=%d\nb2=%d\nb3=%n ",x.b1,x.b2,x.b3);
}
protected :
int b2;
private :
int b3;
};
void main()
{
B bb;
bb.TestAccess(bb);
}
Компилится , но не работает .
-
- Уже с Приветом
- Posts: 427
- Joined: 08 May 2001 09:01
доступ к элементам класса
<blockquote><font size="1" face="Arial, Verdana, Helvetica, sans-serif">quote:</font><hr>Originally posted by listen_me_now:
<strong>
Компилится , но не работает .</strong><hr></blockquote>
Правильно делает, кстати. Стэк то не резиновый.
<strong>
Компилится , но не работает .</strong><hr></blockquote>
Правильно делает, кстати. Стэк то не резиновый.
-
- Уже с Приветом
- Posts: 753
- Joined: 18 Sep 2000 09:01
- Location: Fremont, CA
доступ к элементам класса
угу. стэк точно не резиновый, но даже если бы он и был бы резиновым, все равно printf в этом коде unreachable. у вас создан бесконечный рекурсивный цикл (функция вызывает саму себя внутри самой себя).
-
- Уже с Приветом
- Posts: 1645
- Joined: 07 Nov 2001 10:01
- Location: Kiev, UA -> Fairfax, VA
доступ к элементам класса
Я так понимаю что основной подлостью тут является то, что работаем мы в методе класса B но с другим объектом. Так что поля private и protected недоступны.
-
- Уже с Приветом
- Posts: 242
- Joined: 03 Jan 2000 10:01
- Location: TX > MA/NH > NJ/NYC
доступ к элементам класса
<blockquote><font size="1" face="Arial, Verdana, Helvetica, sans-serif">quote:</font><hr>Originally posted by sttranik:
<strong>ошибок доступа быть не должно.
...
непонятно в чем тут проблема вообще? класс всегда является другом сам себе, и область видимости его членов внутри самого себя всегда одна и та же.</strong><hr></blockquote>
абсолютно правильно.
(я теперь понял, почему те джавники с которыми про интервьюи общался эту задачку обычно не брали - нет сишных "друзей", которые явно декларируют, что ко всем элементам об"ектов чужого класса есть доступ)
проблема собственно в доступе к private parts другого об"екта - некоторых такое открытие просто шокировало, [img:f1a03e8814]images/smiles/icon_wink.gif[/img:f1a03e8814] - что как бы не совсем OOD и для дизайна скорее вредно чем осмысленно (ИМХО, конечно - если кто знает применимость class level access modifiers в дизайне не поленитесь, напишите... хотя бы чтоб поспорить [img:f1a03e8814]images/smiles/icon_smile.gif[/img:f1a03e8814] )
нафига это нужно:
- copy constructor / assignment operator,
- операции типа static метода, работающего со всеми созданными об"ектами класса,
- что еще?
----
D.
<strong>ошибок доступа быть не должно.
...
непонятно в чем тут проблема вообще? класс всегда является другом сам себе, и область видимости его членов внутри самого себя всегда одна и та же.</strong><hr></blockquote>
абсолютно правильно.
(я теперь понял, почему те джавники с которыми про интервьюи общался эту задачку обычно не брали - нет сишных "друзей", которые явно декларируют, что ко всем элементам об"ектов чужого класса есть доступ)
проблема собственно в доступе к private parts другого об"екта - некоторых такое открытие просто шокировало, [img:f1a03e8814]images/smiles/icon_wink.gif[/img:f1a03e8814] - что как бы не совсем OOD и для дизайна скорее вредно чем осмысленно (ИМХО, конечно - если кто знает применимость class level access modifiers в дизайне не поленитесь, напишите... хотя бы чтоб поспорить [img:f1a03e8814]images/smiles/icon_smile.gif[/img:f1a03e8814] )
нафига это нужно:
- copy constructor / assignment operator,
- операции типа static метода, работающего со всеми созданными об"ектами класса,
- что еще?
----
D.
-
- Уже с Приветом
- Posts: 242
- Joined: 03 Jan 2000 10:01
- Location: TX > MA/NH > NJ/NYC
доступ к элементам класса
<blockquote><font size="1" face="Arial, Verdana, Helvetica, sans-serif">quote:</font><hr>Originally posted by gekkarp:
<strong>Я так понимаю что основной подлостью тут является то, что работаем мы в методе класса B но с другим объектом. Так что поля private и protected недоступны.</strong><hr></blockquote>
вот вот - именно "Подлость" ! [img:ad0afc660e]images/smiles/icon_wink.gif[/img:ad0afc660e]
<strong>Я так понимаю что основной подлостью тут является то, что работаем мы в методе класса B но с другим объектом. Так что поля private и protected недоступны.</strong><hr></blockquote>
вот вот - именно "Подлость" ! [img:ad0afc660e]images/smiles/icon_wink.gif[/img:ad0afc660e]
-
- Уже с Приветом
- Posts: 1645
- Joined: 07 Nov 2001 10:01
- Location: Kiev, UA -> Fairfax, VA
доступ к элементам класса
<blockquote><font size="1" face="Arial, Verdana, Helvetica, sans-serif">quote:</font><hr>Originally posted by Drom:
<strong>
вот вот - именно "Подлость" ! [img:3f7348733f]images/smiles/icon_wink.gif[/img:3f7348733f] </strong><hr></blockquote>
Да, забыл сказать что это для Java. [img:3f7348733f]images/smiles/icon_smile.gif[/img:3f7348733f]
Для С++ просто не помню. Но раз народ говорит что класс самому себе друг, товарищ и брат...
<strong>
вот вот - именно "Подлость" ! [img:3f7348733f]images/smiles/icon_wink.gif[/img:3f7348733f] </strong><hr></blockquote>
Да, забыл сказать что это для Java. [img:3f7348733f]images/smiles/icon_smile.gif[/img:3f7348733f]
Для С++ просто не помню. Но раз народ говорит что класс самому себе друг, товарищ и брат...
-
- Уже с Приветом
- Posts: 1645
- Joined: 07 Nov 2001 10:01
- Location: Kiev, UA -> Fairfax, VA
доступ к элементам класса
<blockquote><font size="1" face="Arial, Verdana, Helvetica, sans-serif">quote:</font><hr>Originally posted by Drom:
<strong>
вот вот - именно "Подлость" ! [img:6d8afdb406]images/smiles/icon_wink.gif[/img:6d8afdb406] </strong><hr></blockquote>
В Java2 есть другое извращение - доступ на уровне пакета.
Т.е.
int A будет видна классами этого пакета но не потомками класса в другом пакете. Ж)
У сана для Java2 Programmer есть ряд таких подлых вопросов.
<strong>
вот вот - именно "Подлость" ! [img:6d8afdb406]images/smiles/icon_wink.gif[/img:6d8afdb406] </strong><hr></blockquote>
В Java2 есть другое извращение - доступ на уровне пакета.
Т.е.
int A будет видна классами этого пакета но не потомками класса в другом пакете. Ж)
У сана для Java2 Programmer есть ряд таких подлых вопросов.