| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > .NET для новичков > Переопределение объектов |
| Автор: ЛунныйОборотень 10.6.2013, 19:47 |
| Здравствуйте! Подскажите пожалуйста такую вещь. Например, есть класс А и отнаследованный от него класс B. Что получится, если написать B=new A()?Получится, что B станет фактически A? Спасибо. |
| Автор: Экскалупатор 10.6.2013, 20:20 |
| Фактически будет ошибка приведения типов, потому что А не может приводиться к B. |
| Автор: boevik 10.6.2013, 20:21 | ||
| Это не пройдет компиляцию. Можно так:
В run-time в переменной а находится обэкт B. |
| Автор: Arantir 10.6.2013, 20:29 | ||
Так нельзя написать. Потому что A "не знает" о B. Можно написать
Почитайте о ключевом слове virtual. Оно как раз для таких случаев. Если есть виртуальный метод из A, и такой же переопределенный в В, то в вышеописанном случае будет использоваться именно переопределенный метод, не смотря на то, что тип переменной — А. Не виртуальные же методы будут взяты как раз из класса А, по типу переменной, а не по объекту. Но, вообще, это частный случай. Подобный код становится более логичным и полезным, когда A — это абстрактный класс либо интерфейс. Тогда это код просто будет означать, что В должен наследовать/реализовывать А. Это полезно, если класс В формируется динамически или не является частю программы (если это какой-то фреймворк и В должен реализовать пользователь). |
| Автор: ЛунныйОборотень 17.6.2013, 21:38 | ||
| с virtual я знаком, но видимо, не правильно выразил вопрос. Например, можно ли написать и есть ли смысл в выражении
Получается, что это объект реализующий фактически ArrayList? Спасибо. |
| Автор: diadiavova 18.6.2013, 11:20 |
Если говорить не о конкретно этом выражении, а о выражениях такого типа, то смысл вполне себе может быть. Здесь имеет место неявное приведение типов, а оно иногда имеет последствия. То есть иными словами, один и тот же объект, будучи загруженным в переменные разных типов может вести себя по разному. В первую очередь такое поведение имеет место в случаях явной реализации интерфейсов. То есть, в тех ситуациях, когда в одном классе реализуется несколько интерфейсов, может статься, что два интерфейса имеют члены с одинаковыми сигнатурами, в этих случаях такие члены надо реализовывать, явно указывая какой именно интерфейс имеется в виду. Тогда такой метод будет доступен только при приведении типа к данному интерфейсу. В том же бейсике, реализация интерфейсов организована несколько иначе и там вообще не важно как называется метод, реализующий декларацию из интерфейса и вызывая у класса метод с именем, совпадающим с именем метода интерфейса, в принципе нельзя быть уверенным, что это тот самый метод. В качестве другого примера можно привести затеняющие декларации ( с использованием ключевого слова new, хотя оно в таких ситуациях и необязательно). То есть если в производном классе объявляется член с сигнатурой, совпадающей с сигнатурой члена базового класса, то член базового класса может быть не виден в производном, но при приведении к базовому типу вызываться будет именно он(этим затенение отличается от переопределения). |