![]() |
Модераторы: Partizan, gambit |
![]() ![]() ![]() |
|
ЛунныйОборотень |
|
|||
Бывалый ![]() Профиль Группа: Участник Сообщений: 174 Регистрация: 12.11.2006 Репутация: нет Всего: 1 |
Здравствуйте!
Подскажите пожалуйста такую вещь. Например, есть класс А и отнаследованный от него класс B. Что получится, если написать B=new A()?Получится, что B станет фактически A? Спасибо. |
|||
|
||||
Экскалупатор |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1746 Регистрация: 1.4.2009 Где: г. Минск Репутация: 5 Всего: 24 |
Фактически будет ошибка приведения типов, потому что А не может приводиться к B.
|
|||
|
||||
boevik |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1452 Регистрация: 31.5.2004 Где: Израиль Репутация: нет Всего: 35 |
Это не пройдет компиляцию.
Можно так:
В run-time в переменной а находится обэкт B. -------------------- Никогда не говори никогда |
|||
|
||||
Arantir |
|
|||
Рыбак без удочки ![]() ![]() Профиль Группа: Участник Сообщений: 960 Регистрация: 18.11.2012 Репутация: 1 Всего: 55 |
Так нельзя написать. Потому что A "не знает" о B. Можно написать
Почитайте о ключевом слове virtual. Оно как раз для таких случаев. Если есть виртуальный метод из A, и такой же переопределенный в В, то в вышеописанном случае будет использоваться именно переопределенный метод, не смотря на то, что тип переменной — А. Не виртуальные же методы будут взяты как раз из класса А, по типу переменной, а не по объекту. Но, вообще, это частный случай. Подобный код становится более логичным и полезным, когда A — это абстрактный класс либо интерфейс. Тогда это код просто будет означать, что В должен наследовать/реализовывать А. Это полезно, если класс В формируется динамически или не является частю программы (если это какой-то фреймворк и В должен реализовать пользователь). Это сообщение отредактировал(а) Arantir - 10.6.2013, 20:31 -------------------- interface Жопа { // ATTENTION: has to be implemented by every class of the project for proper project work } |
|||
|
||||
ЛунныйОборотень |
|
|||
Бывалый ![]() Профиль Группа: Участник Сообщений: 174 Регистрация: 12.11.2006 Репутация: нет Всего: 1 |
с virtual я знаком, но видимо, не правильно выразил вопрос.
Например, можно ли написать и есть ли смысл в выражении
Получается, что это объект реализующий фактически ArrayList? Спасибо. |
|||
|
||||
Arantir |
|
||||||
Рыбак без удочки ![]() ![]() Профиль Группа: Участник Сообщений: 960 Регистрация: 18.11.2012 Репутация: 1 Всего: 55 |
Вообще-то, это код скорее из Java, чем из C#. Но, знаете, на самом деле сути ответа это совершенно не меняет. Можно записать только так
В C# нельзя записать
Так можно записать в Java, потому что List - это интерфейс и его реализует класс ArrayList. Вообще суть этой записи следующая: Я создаю объект, который имеет все поля и методы List. А как именно они будут работать - зависит от класса в правой части выражения. В данном примере методы работают так, как описано в ArrayList. А смысл таков: Я могу заменить ArrayList на что душе угодно, реализующее List, и при этом мне не придется переписывать больше ни одной строки в программе. Более общий случай из этого - я могу написать программу, которая работает с любым классом, реализующим List. Добавлено через 3 минуты и 58 секунд
Все наоборот. В вашем примере объект будет являться реализацией List и экземпляром ArrayList. То, что реализует ArrayList - это сам ArrayList, если так можно выразиться, так как это просто класс (не интерфейс и не абстрактный). -------------------- interface Жопа { // ATTENTION: has to be implemented by every class of the project for proper project work } |
||||||
|
|||||||
diadiavova |
|
|||
![]() Доктор Зло(диагност, настоящий, с лицензией и полномочиями) ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 5821 Регистрация: 14.8.2008 Где: В Коньфпольте Репутация: 18 Всего: 142 |
Если говорить не о конкретно этом выражении, а о выражениях такого типа, то смысл вполне себе может быть. Здесь имеет место неявное приведение типов, а оно иногда имеет последствия. То есть иными словами, один и тот же объект, будучи загруженным в переменные разных типов может вести себя по разному. В первую очередь такое поведение имеет место в случаях явной реализации интерфейсов. То есть, в тех ситуациях, когда в одном классе реализуется несколько интерфейсов, может статься, что два интерфейса имеют члены с одинаковыми сигнатурами, в этих случаях такие члены надо реализовывать, явно указывая какой именно интерфейс имеется в виду. Тогда такой метод будет доступен только при приведении типа к данному интерфейсу. В том же бейсике, реализация интерфейсов организована несколько иначе и там вообще не важно как называется метод, реализующий декларацию из интерфейса и вызывая у класса метод с именем, совпадающим с именем метода интерфейса, в принципе нельзя быть уверенным, что это тот самый метод. В качестве другого примера можно привести затеняющие декларации ( с использованием ключевого слова new, хотя оно в таких ситуациях и необязательно). То есть если в производном классе объявляется член с сигнатурой, совпадающей с сигнатурой члена базового класса, то член базового класса может быть не виден в производном, но при приведении к базовому типу вызываться будет именно он(этим затенение отличается от переопределения). -------------------- Хочешь получить мудрый совет - читай подписи участников форумов. Злой доктор Щасзаболит ![]() |
|||
|
||||
![]() ![]() ![]() |
Прежде чем создать тему, посмотрите сюда: | |
|
Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов. Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :) Так же не забывайте отмечать свой вопрос решенным, если он таковым является :) Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, Partizan, PashaPash. |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | .NET для новичков | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |