доступ к элементам класса

и задачки для интервью.
Drom
Уже с Приветом
Posts: 242
Joined: 03 Jan 2000 10:01
Location: TX > MA/NH > NJ/NYC

доступ к элементам класса

Post by Drom »

задачка скорее извращенная, чем сложная (может она даже здесь пробегала):

<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)

уверен, что половина сиджавников тут уже знает ответ - дайте, пожалуйста, поразвлекаться другой половине.
User avatar
sttranik
Уже с Приветом
Posts: 753
Joined: 18 Sep 2000 09:01
Location: Fremont, CA

доступ к элементам класса

Post by sttranik »

ошибок доступа быть не должно.

если параметр (класс) будет объявлен как наследник B, то будет зависить от типа наследования (если public, то без ошибок, если private, то к private членам доступа не будет).

непонятно в чем тут проблема вообще? класс всегда является другом сам себе, и область видимости его членов внутри самого себя всегда одна и та же.
User avatar
sttranik
Уже с Приветом
Posts: 753
Joined: 18 Sep 2000 09:01
Location: Fremont, CA

доступ к элементам класса

Post by sttranik »

да, забыл сказать - это я все с точки зрения C++ говорил. в джавах не силен и даже не знаю есть ли там друзья у классов.
User avatar
listen_me_now
Новичок
Posts: 86
Joined: 27 Feb 2001 10:01
Location: Omsk , Russia

доступ к элементам класса

Post by listen_me_now »

А как насчет вот этого ?

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);
}

Компилится , но не работает .
User avatar
IPoloz
Уже с Приветом
Posts: 427
Joined: 08 May 2001 09:01

доступ к элементам класса

Post by IPoloz »

<blockquote><font size="1" face="Arial, Verdana, Helvetica, sans-serif">quote:</font><hr>Originally posted by listen_me_now:
<strong>
Компилится , но не работает .</strong><hr></blockquote>
Правильно делает, кстати. Стэк то не резиновый.
User avatar
sttranik
Уже с Приветом
Posts: 753
Joined: 18 Sep 2000 09:01
Location: Fremont, CA

доступ к элементам класса

Post by sttranik »

угу. стэк точно не резиновый, но даже если бы он и был бы резиновым, все равно printf в этом коде unreachable. у вас создан бесконечный рекурсивный цикл (функция вызывает саму себя внутри самой себя).
gekkarp
Уже с Приветом
Posts: 1645
Joined: 07 Nov 2001 10:01
Location: Kiev, UA -> Fairfax, VA

доступ к элементам класса

Post by gekkarp »

Я так понимаю что основной подлостью тут является то, что работаем мы в методе класса B но с другим объектом. Так что поля private и protected недоступны.
Drom
Уже с Приветом
Posts: 242
Joined: 03 Jan 2000 10:01
Location: TX > MA/NH > NJ/NYC

доступ к элементам класса

Post by Drom »

<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.
Drom
Уже с Приветом
Posts: 242
Joined: 03 Jan 2000 10:01
Location: TX > MA/NH > NJ/NYC

доступ к элементам класса

Post by Drom »

<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]
gekkarp
Уже с Приветом
Posts: 1645
Joined: 07 Nov 2001 10:01
Location: Kiev, UA -> Fairfax, VA

доступ к элементам класса

Post by gekkarp »

<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]
Для С++ просто не помню. Но раз народ говорит что класс самому себе друг, товарищ и брат...
gekkarp
Уже с Приветом
Posts: 1645
Joined: 07 Nov 2001 10:01
Location: Kiev, UA -> Fairfax, VA

доступ к элементам класса

Post by gekkarp »

<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 есть ряд таких подлых вопросов.

Return to “Головоломки”