Модераторы: Partizan, gambit
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Переопределение объектов 
:(
    Опции темы
ЛунныйОборотень
Дата 10.6.2013, 19:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 174
Регистрация: 12.11.2006

Репутация: нет
Всего: 1



Здравствуйте!

Подскажите пожалуйста такую вещь.

Например, есть класс А и отнаследованный от него класс B.

Что получится, если написать B=new A()?Получится, что B станет фактически A?

Спасибо.
PM MAIL   Вверх
Экскалупатор
Дата 10.6.2013, 20:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1746
Регистрация: 1.4.2009
Где: г. Минск

Репутация: 5
Всего: 24



Фактически будет ошибка приведения типов, потому что А не может приводиться к B.

PM MAIL ICQ   Вверх
boevik
Дата 10.6.2013, 20:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1452
Регистрация: 31.5.2004
Где: Израиль

Репутация: нет
Всего: 35



Это не пройдет компиляцию.
Можно так:
Код

A a = new B()

В run-time в переменной а находится обэкт B.


--------------------
Никогда не говори никогда
PM MAIL WWW   Вверх
Arantir
Дата 10.6.2013, 20:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Рыбак без удочки
**


Профиль
Группа: Участник
Сообщений: 960
Регистрация: 18.11.2012

Репутация: 1
Всего: 55



Цитата(ЛунныйОборотень @  10.6.2013,  18:47 Найти цитируемый пост)
Что получится, если написать B=new A()?

Так нельзя написать. Потому что A "не знает" о B.
Можно написать 
Код

A b = new 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
}
PM   Вверх
ЛунныйОборотень
Дата 17.6.2013, 21:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 174
Регистрация: 12.11.2006

Репутация: нет
Всего: 1



с virtual я знаком, но видимо, не правильно выразил вопрос.
Например, можно ли написать и есть ли смысл в выражении 
Код

List list=new ArrayList();

Получается, что это объект реализующий фактически ArrayList?
Спасибо.
PM MAIL   Вверх
Arantir
Дата 17.6.2013, 21:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Рыбак без удочки
**


Профиль
Группа: Участник
Сообщений: 960
Регистрация: 18.11.2012

Репутация: 1
Всего: 55



Цитата(ЛунныйОборотень @  17.6.2013,  20:38 Найти цитируемый пост)
Например, можно ли написать и есть ли смысл в выражении 

Вообще-то, это код скорее из Java, чем из C#.
Но, знаете, на самом деле сути ответа это совершенно не меняет.

Можно записать только так
Код

Parent obj = new Child();
 если Child реализует/наследует Parent. 

В C# нельзя записать
Код

List<int> list = new ArrayList();
потому что класс ArrayList не наследует класс List.
Так можно записать в Java, потому что List - это интерфейс и его реализует класс ArrayList.

Вообще суть этой записи следующая:
Я создаю объект, который имеет все поля и методы List. А как именно они будут работать - зависит от класса в правой части выражения. В данном примере методы работают так, как описано в ArrayList.

А смысл таков:
Я могу заменить ArrayList на что душе угодно, реализующее List, и при этом мне не придется переписывать больше ни одной строки в программе.
Более общий случай из этого - я могу написать программу, которая работает с любым классом, реализующим List.

Добавлено через 3 минуты и 58 секунд
Цитата(ЛунныйОборотень @  17.6.2013,  20:38 Найти цитируемый пост)
Получается, что это объект реализующий фактически ArrayList?

Все наоборот. В вашем примере объект будет являться реализацией List и экземпляром ArrayList. То, что реализует ArrayList - это сам ArrayList, если так можно выразиться, так как это просто класс (не интерфейс и не абстрактный).


--------------------
interface Жопа {
    // ATTENTION: has to be implemented by every class of the project for proper project work
}
PM   Вверх
diadiavova
Дата 18.6.2013, 11:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Доктор Зло(диагност, настоящий, с лицензией и полномочиями)
****


Профиль
Группа: Модератор
Сообщений: 5821
Регистрация: 14.8.2008
Где: В Коньфпольте

Репутация: 18
Всего: 142



Цитата(ЛунныйОборотень @  17.6.2013,  22:38 Найти цитируемый пост)
Например, можно ли написать и есть ли смысл в выражении 

Если говорить не о конкретно этом выражении, а о выражениях такого типа, то смысл вполне себе может быть. Здесь имеет место неявное приведение типов, а оно иногда имеет последствия. То есть иными словами, один и тот же объект, будучи загруженным в переменные разных типов может вести себя по разному. 
В первую очередь такое поведение имеет место в случаях явной реализации интерфейсов. То есть, в тех ситуациях, когда в одном классе реализуется несколько интерфейсов, может статься, что два интерфейса имеют члены с одинаковыми сигнатурами, в этих случаях такие члены надо реализовывать, явно указывая какой именно интерфейс имеется в виду. Тогда такой метод будет доступен только при приведении типа к данному интерфейсу. В том же бейсике, реализация интерфейсов организована несколько иначе и там вообще не важно как называется метод, реализующий декларацию из интерфейса и вызывая у класса метод с именем, совпадающим с именем метода интерфейса, в принципе нельзя быть уверенным, что это тот самый метод.
В качестве другого примера можно привести затеняющие декларации ( с использованием ключевого слова new, хотя оно в таких ситуациях и необязательно). То есть если в производном классе объявляется член с сигнатурой, совпадающей с сигнатурой члена базового класса, то член базового класса может быть не виден в производном, но при приведении к базовому типу вызываться будет именно он(этим затенение отличается от переопределения).


--------------------
Хочешь получить мудрый совет - читай подписи участников форумов.
Злой доктор Щасзаболит smile
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
Partizan
PashaPash

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, Partizan, PashaPash.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | .NET для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.1023 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.