![]() |
Модераторы: Partizan, gambit Страницы: (15) Все « Первая ... 4 5 [6] 7 8 ... Последняя »
( Перейти к первому непрочитанному сообщению ) |
![]() ![]() ![]() |
|
Allexx |
|
|||
Новичок Профиль Группа: Участник Сообщений: 13 Регистрация: 16.12.2003 Репутация: нет Всего: нет |
|
|||
|
||||
arilou |
|
|||
![]() Великий МунаБудвин ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 2646 Регистрация: 15.7.2004 Где: город-герой Минск Репутация: 21 Всего: 61 |
Если ты будешь использовать не конкретные классы из System.Data.OleDb или System.Data.SqlClient, а интерфейсы из System.Data (например, IDbCommand, IDataProvider, IConnection, ITransaction, etc), то тоже можешь благополучно сменять БД (конечно, при условии, что твой SQL SQL-92 compliant). |
|||
|
||||
batigoal |
|
||||||
![]() Нелетучий Мыш ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6423 Регистрация: 28.12.2004 Где: Санктъ-Петербургъ Репутация: 1 Всего: 151 |
Явное объявление исключений, бросаемых методом, считаю одним из лучших свойств языка Java. Имхо.
Мда, это действительно нехорошо. -------------------- "Чтобы правильно задать вопрос, нужно знать большую часть ответа" (Р. Шекли) ЖоржЖЖ |
||||||
|
|||||||
Domestic Cat |
|
||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5452 Регистрация: 3.5.2004 Где: Dallas, US Репутация: 9 Всего: 172 |
Как это? - мне ведь эtи интерфейсы реализовать нужно, так ведь? Откуда в ниh функциональность возьмется? К тому ж Студия слишом упростила работу с АДО, так что малo кто будет будet подобнoe делать.
это как в с++, только new еще добавлен. -------------------- |
||||
|
|||||
mr.DUDA |
|
||||||
![]() 3D-маньяк ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 8244 Регистрация: 27.7.2003 Где: город-герой Минск Репутация: 110 Всего: 232 |
Если кому-то что-то кажется необоснованным, то сначала надо ознакомиться с теорией (зачем это нужно и что это даёт), а уж затем говорить о "кривизне" подхода. 1) virtual - декларирует виртуальный метод; 2) override - перекрывает реализацию вирт.метода в производном классе. В С++ зачастую не было ясно, что откуда унаследовано и перекрыто, в то время как читая шарповский код - сразу понимаешь:что, как и почему; 3) new - позволяет ввести в класс невиртуальный метод с той же сигнатурой что и виртуальный в базовом классе. При этом, в классе остаётся и виртуальный метод, его тоже можно вызывать если привести тип к базовому. В С++ такой возможности не было. Если нужны примеры, для чего это может применяться - приведу.
Откуда я могу заранее узнать обо всех исключениях, которые может выкинуть метод? С другой стороны, если НУЖНО знать, какие СПЕЦИФИЧНЫЕ исключения может выкинуть метод или свойство - всегда можно задокументировать их в XML-комментариях (там есть специальный тэг для этого). -------------------- ![]() |
||||||
|
|||||||
batigoal |
|
||||
![]() Нелетучий Мыш ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6423 Регистрация: 28.12.2004 Где: Санктъ-Петербургъ Репутация: 1 Всего: 151 |
Они объявлены в описании тех методов, которые ты вызываешь в своем ![]()
Разумно. Мне нравится. Приведи, пожалуйста, пример. P.S. Если ты не указываешь override, но при этом осуществляешь переопределение, это вызовет оштбку компиляции? -------------------- "Чтобы правильно задать вопрос, нужно знать большую часть ответа" (Р. Шекли) ЖоржЖЖ |
||||
|
|||||
arilou |
|
||||||||
![]() Великий МунаБудвин ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 2646 Регистрация: 15.7.2004 Где: город-герой Минск Репутация: 21 Всего: 61 |
Накропал небольшой пример. Если чего-то еще продемнострировать, скажите, допишу.
Т.е. все провайдеры в ADO.NET реализуют один общий набор интерфейсов. В своем коде ты можешь работать с объектами типа интерфейса. Могу пояснить, как указать в рантайме, с каким провайдером работать, если нужно. |
||||||||
|
|||||||||
arilou |
|
|||
![]() Великий МунаБудвин ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 2646 Регистрация: 15.7.2004 Где: город-герой Минск Репутация: 21 Всего: 61 |
Добавление про ссылки на методы: компилятор не даст прицепить метод к переменной-делегату, если сигнатура (кол-во и типы параметров) не совпадает
|
|||
|
||||
Domestic Cat |
|
||||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5452 Регистрация: 3.5.2004 Где: Dallas, US Репутация: 9 Всего: 172 |
чтo -то разговор переходит в нехорошее русло. Я прекрасно знаю для чего это нужно. В Java все (кроме статик) методы по умолчанию виртуальны, все методы сабклассов с такой же сигнатурой по умолчанию override, добиться невозможность перегрузки можнос помощью final. Единственный аргмент, который я встречаю в пользу override/new/virtual - это versioning. Например, разработчик использует библиотеку, наследуя от класса А , и декларирует метод М . Если в следующей версии в библиотеку будет включен метод М, то в Java получится что разработчик делает override этого метода, хотя скорее всего он этого делать не хотел. Вроде бы тут и нужны new и проч. Но у такого подхода есть свой недостаток: если ты не объявляешь метод виртуальным, его нельзя перегрузить. Если разработчик не объявил метод А виртуальным, а наследующему классу нужно сдеелать оверрайд метода - этого сделать уже никак нельзя. Ситуация номер 2: Есть класс с методом virtual A. Есть наследник, с методом new virtual A. Если теперь кто-то наследует от этого класса и не заметит что он new, получим хороший баг.
Дык опять делегаты?
в твоем примере ты пользуешь System.Data.SqlClient.SqlConnection() - для МСДЕ пойдет, а что если мне нужен Oracle? -------------------- |
||||||
|
|||||||
mr.DUDA |
|
||||||||
![]() 3D-маньяк ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 8244 Регистрация: 27.7.2003 Где: город-герой Минск Репутация: 110 Всего: 232 |
Пожалуйста. Вот задача. Имеется абстрактный базовый класс Base (или интерфейс, как будет угодно). В нём есть виртуальный (или переопределяемый, не знаю как в JAVA это называется) метод Action(). Нужно унаследоваться от Base таким образом, чтобы класс Derived перекрывал метод Action() и "запечатывал" его (т.е. запрещал для дальнейшего перекрытия). З.Ы. это называется member names hiding. Добавлено @ 19:18
Согласен.
Это я к тому, что ИМХО, с virtual/new удобнее ![]() -------------------- ![]() |
||||||||
|
|||||||||
Domestic Cat |
|
||||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5452 Регистрация: 3.5.2004 Где: Dallas, US Репутация: 9 Всего: 172 |
Во-первых скажу так: это уж совсем "высший пилотаж", то есть я допускаю что такоe иногда нужно, но такжe допускаю и тo, что всегда можно обойтись без этого. Пример:
Результat [quote] A.java:16: Y() in B cannot override Y() in A; overridden method is final public void Y() ^ 1 error Добавлено @ 19:22
![]() ![]() ![]() -------------------- |
||||||
|
|||||||
arilou |
|
||||||||||||
![]() Великий МунаБудвин ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 2646 Регистрация: 15.7.2004 Где: город-герой Минск Репутация: 21 Всего: 61 |
Похоже, возникло непонимание по поводу делегатов и с чем их едят. Поясняю: Делегаты решают проблему, которая в других языках решалась с помощью указателей на функции. В отличии от последних, делегаты типизированы. Это означает, что
(Сам себя цитирую ![]() Понятие делегата содержит в себе 2 вещи. По-моему, они именуются одним и тем же словом "делегат", по крайней мере, в моей речи. Из-за этого могут возникать непонятки. Поэтому существуют: 1) Делегат-тип. Описывает сигнатуру с помощью заразервированного слова delegate:
Этот код объявляет тип TestDelegateType, который описывает ссылку на метод, не возвращающий значения (void), и требующий параметров string и int именно в таком порядке. 2) Переменную типа делегат. Описывает фактическую ссылку на метод.
Т.о. переменная delegateObject будет испольоваться для того, чтобы "подцепить" к ней метод, и делать с ним всякие непотребные вещи, например, вызывать ![]()
Этот код записывает в delegateObject ссылку (читай, type-safe pointer) на метод delegateMethod. Обратите внимание, что типы параметров данного метода соответствуют типам параметров, указанных в определении TestDelegateType. Таким образом, делегаты реализуют то, что в C++ называлось указателем на функцию, но не выносилось в отдельное понятие языка. В отличии от C++, делегаты являются type-safe языковыми конструкциями. Одним из применений делегатов являются события.
Если упростить, то это практически равнозначно определению TestDelegateEvent, как переменной типа TestDelegateType. Надеюсь, что я развеял непонятки по поводу делегатов. |
||||||||||||
|
|||||||||||||
mr.DUDA |
|
|||
![]() 3D-маньяк ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 8244 Регистрация: 27.7.2003 Где: город-герой Минск Репутация: 110 Всего: 232 |
Аналогично на шарпе:
Два класса (X и Y) - вырожденный пример, на самом деле их бывает больше. Практическая польза от new может быть извлечена не только в плане возможности "запечатать" полиморфный метод, но и в случае, если нужно ввести "новый" метод, который никак не связан с методом базового класса но имеет ту же сигнатуру. -------------------- ![]() |
|||
|
||||
Domestic Cat |
|
||||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5452 Регистрация: 3.5.2004 Где: Dallas, US Репутация: 9 Всего: 172 |
Видимо мы немного недопоняли друг друга.
Я указывал вот на что:
То есть, что такое delegateMethod? Ссылка на метод. Но можно ли ее использовать где -нибудь еще, например, как в Питоне написать
Я понимаю- всe это отсутствует, вместo используется делегат, что по сути тo ж самое. Так чо ладно, забудем прo delegateMethod - в конце концов этo неважно. Добавлено @ 19:57
Как говорится, палка о двух концах - я уже говорил что это для использующих такой меод нетривиальная вещь, можно легкo забыть (положить объект в контейнер с типом суперкласса например) и потом искать отчего непонятно что проишодит. С другой стороны, посмотри на это с точкi зрения ООП: есть класс Машина, с методом Ехать. Ктo-тo наследовал от нее класс БМВ и сделал метод Ехать new; так что теперь БМВ не едет а летит. Получается теперь, что если смотреть на такоj объект как нa БМВ, тo он летит; нo как только оn рассматривается как Машинa, - он едет ![]() -------------------- |
||||||
|
|||||||
arilou |
|
||||||
![]() Великий МунаБудвин ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 2646 Регистрация: 15.7.2004 Где: город-герой Минск Репутация: 21 Всего: 61 |
ОК. Давай вернемся к ADO.NET. Ты спрашивал, как использовать Oracle через ADO.NET. Я не знаю, есть ли managed реализация провайдера для Оракла, совместимая с .NET 1.1, но знаю, что в NET 2.0 она будет (System.Data.OracleClient). Теперь об интерфейсах ADO.NET и их использовании. Допустим, тебе надо в своем приложении реализовать работу с MS Access и SQL Server. Естественно, ты захочешь работать с базами унифицированно. Для этого применяются вышеописанные интерфейсы. В своей проге я указываю, какой провайдер мне нужен, в конфигурационном файле. У меня есть класс Configuration:
Во всей программе используется Configuration.Provider для доступа к данным:
Я думаю, что почти ничего нового в этом подходе ты не увидишь, кроме того, как сделать, чтобы не заморачиваться с разными ADO.NET провайдерами. |
||||||
|
|||||||
Domestic Cat |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5452 Регистрация: 3.5.2004 Где: Dallas, US Репутация: 9 Всего: 172 |
Согласен, но JDBC вообще изначально не зависит ни от какого провайдера. Все что ей нужно - драйвер, предоставляемый провайдером; если ты хочеш сменить базу данных, ты меняешь драйвер.
Точно так же Java работает с Naming and Directory Services, Authentification and Authorization Services и т п - предоставлят интерфейс, единый для всех. Поэому я могу написать Java приложение, для использования которого нужнa аутентификация, причем оно не поменяется, если я сменю Виндовс аутентификацию на Керберос. -------------------- |
|||
|
||||
![]() ![]() ![]() |
Прежде чем создать тему, посмотрите сюда: | |
|
Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов. Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :) Так же не забывайте отмечать свой вопрос решенным, если он таковым является :) Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle. |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Общие вопросы по .NET и C# | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |