| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Общие вопросы по .NET и C# > Переход с Java на C# |
| Автор: math64 25.11.2008, 12:55 |
| В Java по умолчанию доступ к полям имеют классы из того же пакета. В C++ для этого используется friend. Есть ли что-нибудь такое в C# ? |
| Автор: Partizan 25.11.2008, 13:01 |
| math64, ну может быть internal.... |
| Автор: Veitmen 25.11.2008, 13:02 |
| В .net это internal. |
| Автор: math64 2.12.2008, 09:14 | ||||
| А что есть аналог myClass.class ? obj.GetType() вернёт действительный тип объекта, и не применим если нужно получить тип абстрактного класса или интерфейса. То, что нужно можно получить так:
Нашел:
|
| Автор: math64 3.12.2008, 16:44 |
| Вложенные (не static) классы на Java имеют скрытый указатель this на внешний класс. В C# этого нет. Нужно создавать такой указатель вручную? |
| Автор: PashaPash 4.12.2008, 01:00 | ||
В C#/.NET объект вложенного класса никак не связан с внешним, и вообще является самостоятельным независимым типом. Вложенность - только способ ограничить область видимости, т.е. классы точно так же "вкладываются" в namespace, как и в друг друга. |
| Автор: archeg 4.12.2008, 01:04 | ||
Я конечно не специалист в джаве, но как-то непонятно как во вложенном классе может быть указатель на экземпляр внешнего класса, если этот экземпляр не может быть доступен (его вообще может не существовать). Не путаем экземпляры и дефинишины |
| Автор: nikitao 4.12.2008, 01:09 | ||
Может автор имел ввиду , что класс имеет ссылку на класс , что его породил... |
| Автор: math64 4.12.2008, 08:58 | ||||||||||
В случае если вложенный класс реализует интерфейс с одним методом, он заменяется на delegate, доступ к классу через свойство Target
Но если во вложенном классе несколько методов, заменить его на delegate нельзя, нужно в конструкторе вложенного класса передавать указатель на внешний, при этом:
нужно переписывать так:
|
| Автор: Zakonnic 4.12.2008, 13:46 |
| Ээээ... чисто ради интереса - это значит, что в джаве можно привести экземпляр внутреннего класса к внешнему? Получается, что это просто наследование таким оригинальным способом? |
| Автор: math64 4.12.2008, 14:15 |
| Outer.this в Java доступен только внутри внутреннего класса. Обычно этот указатель явно не используется (как и Target в делегатах C#). |
| Автор: PashaPash 4.12.2008, 19:36 | ||
math64, в Java Inner можно использовать только внутри Outer, т.е. каждый объект Inner существует только внутри объекта Outer. В C# Inner можно использовать вообще откуда угодно, т.к. он ничем кроме места объявления к Inner не привязан. Т.е. можно сделать вот так:
и получить объект типа Inner никак не привязаный к объекту Outer. |
| Автор: math64 5.12.2008, 11:09 | ||||||
| PashaPash, в Java Inner тоже может использоваться вне Outer. Перевод твоего кода в Java:
Не static:
Перевод второго фрагмента на C#:
И в Java, и в C# вложенный класс является "другом" внешнего и имеет доступ к его private полям |
| Автор: PashaPash 5.12.2008, 11:56 | ||
math64, в случае public static class Inner у Inner нет ссылки на Inner? Гугл подсказывает что static inner на самом деле делает его не inner
Тогда в C# все netsted классы являются static в этом смысле, и поменять это никак нельзя. IMHO, фишка настолько редко используется, что лишние 5 строчек на C# никого не напрягают. В java в ней есть смысл из-за активного использования анонимных классов для event handler-ов. В C# вместо этого используются анонимные методы, без создания доп. обертки в виде класса, и с возможностью обращатся к this. |