![]() |
|
Модераторы: Partizan, gambit |
![]()
|
|
| math64 |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2505 Регистрация: 12.4.2007 Репутация: нет Всего: 72 |
В Java по умолчанию доступ к полям имеют классы из того же пакета. В C++ для этого используется friend. Есть ли что-нибудь такое в C# ?
|
|||
|
||||
| Partizan |
|
|||
![]() Let's do some .NET ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 2828 Регистрация: 19.12.2005 Где: Санкт-Петербург Репутация: 18 Всего: 67 |
math64, ну может быть internal....
-------------------- СУВ, Partizan. |
|||
|
||||
| Veitmen |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 288 Регистрация: 10.11.2006 Где: СПБ Репутация: 3 Всего: 4 |
В .net это internal.
Это сообщение отредактировал(а) Veitmen - 25.11.2008, 13:04 |
|||
|
||||
| Дрон |
|
|||
![]() Java-ненавистник :) ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 3179 Регистрация: 29.12.2002 Где: Санкт-Петербург Репутация: 24 Всего: 93 |
По-умолчанию в C# все члены класса private. Как уже сказали аналог доступа по-умолчанию из Java это internal. Но есть одна тонкость: ближайший аналог package из Java в C# это namespace, но при этом namespace не используется для разграничения доступа, вместо этого используется assembly (сборка). Т.е. в Java классы из двух пакетов: myApp.package1 и myApp.package2 не будут иметь доступа к полям друг друга. А в .NET будут, если эти классы находятся в одной сборке (грубо говоря -- в одной dll-ке). Может я немного мутно объяснил -- лучше будет почитать MSDN -------------------- Да. Именно так. |
|||
|
||||
| math64 |
|
||||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2505 Регистрация: 12.4.2007 Репутация: нет Всего: 72 |
А что есть аналог myClass.class ?
obj.GetType() вернёт действительный тип объекта, и не применим если нужно получить тип абстрактного класса или интерфейса. То, что нужно можно получить так:
Нашел:
Это сообщение отредактировал(а) math64 - 2.12.2008, 10:02 |
||||
|
|||||
| math64 |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2505 Регистрация: 12.4.2007 Репутация: нет Всего: 72 |
Вложенные (не static) классы на Java имеют скрытый указатель this на внешний класс. В C# этого нет. Нужно создавать такой указатель вручную?
|
|||
|
||||
| PashaPash |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1233 Регистрация: 3.1.2008 Репутация: 13 Всего: 49 |
В C#/.NET объект вложенного класса никак не связан с внешним, и вообще является самостоятельным независимым типом. Вложенность - только способ ограничить область видимости, т.е. классы точно так же "вкладываются" в namespace, как и в друг друга. |
|||
|
||||
| archeg |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 612 Регистрация: 6.1.2007 Где: Киев Репутация: 11 Всего: 27 |
Я конечно не специалист в джаве, но как-то непонятно как во вложенном классе может быть указатель на экземпляр внешнего класса, если этот экземпляр не может быть доступен (его вообще может не существовать). Не путаем экземпляры и дефинишины -------------------- ИМХО задница есть универсальный интерфейс. Ибо через задницу можно сделать абсолютно ВСЕ (bash.org.ru) Дядька всегда можно спросить в аське, если не задалбывать - не откажет И вообще, на самом деле я студент, и ненавижу обращение на "Вы") Тут все свои ;) |
|||
|
||||
| nikitao |
|
|||
![]() Кот-программист ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1206 Регистрация: 30.8.2005 Где: Спб Репутация: 4 Всего: 26 |
Может автор имел ввиду , что класс имеет ссылку на класс , что его породил... -------------------- Жизнь - печальная штука. |
|||
|
||||
| math64 |
|
||||||||||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2505 Регистрация: 12.4.2007 Репутация: нет Всего: 72 |
В случае если вложенный класс реализует интерфейс с одним методом, он заменяется на delegate, доступ к классу через свойство Target
Но если во вложенном классе несколько методов, заменить его на delegate нельзя, нужно в конструкторе вложенного класса передавать указатель на внешний, при этом:
нужно переписывать так:
|
||||||||||
|
|||||||||||
| Zakonnic |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 161 Регистрация: 25.4.2006 Репутация: 2 Всего: 6 |
Ээээ... чисто ради интереса - это значит, что в джаве можно привести экземпляр внутреннего класса к внешнему? Получается, что это просто наследование таким оригинальным способом?
--------------------
...и никогда не пишите в комментариях правду |
|||
|
||||
| math64 |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2505 Регистрация: 12.4.2007 Репутация: нет Всего: 72 |
Outer.this в Java доступен только внутри внутреннего класса. Обычно этот указатель явно не используется (как и Target в делегатах C#).
|
|||
|
||||
| PashaPash |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1233 Регистрация: 3.1.2008 Репутация: 13 Всего: 49 |
math64, в Java Inner можно использовать только внутри Outer, т.е. каждый объект Inner существует только внутри объекта Outer. В C# Inner можно использовать вообще откуда угодно, т.к. он ничем кроме места объявления к Inner не привязан. Т.е. можно сделать вот так:
и получить объект типа Inner никак не привязаный к объекту Outer. |
|||
|
||||
| math64 |
|
||||||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2505 Регистрация: 12.4.2007 Репутация: нет Всего: 72 |
PashaPash, в Java Inner тоже может использоваться вне Outer.
Перевод твоего кода в Java:
Не static:
Перевод второго фрагмента на C#:
И в Java, и в C# вложенный класс является "другом" внешнего и имеет доступ к его private полям Это сообщение отредактировал(а) math64 - 5.12.2008, 11:12 |
||||||
|
|||||||
| PashaPash |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1233 Регистрация: 3.1.2008 Репутация: 13 Всего: 49 |
math64, в случае public static class Inner у Inner нет ссылки на Inner? Гугл подсказывает что static inner на самом деле делает его не inner
Тогда в C# все netsted классы являются static в этом смысле, и поменять это никак нельзя. IMHO, фишка настолько редко используется, что лишние 5 строчек на C# никого не напрягают. В java в ней есть смысл из-за активного использования анонимных классов для event handler-ов. В C# вместо этого используются анонимные методы, без создания доп. обертки в виде класса, и с возможностью обращатся к this. |
|||
|
||||
![]()
|
| Прежде чем создать тему, посмотрите сюда: | |
|
|
Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов. Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :) Так же не забывайте отмечать свой вопрос решенным, если он таковым является :) Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Общие вопросы по .NET и C# | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |