Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/40: Рейтинг темы: голосов - 40, средняя оценка - 5.00
52 / 13 / 0
Регистрация: 05.09.2014
Сообщений: 92

О приведении типов и классов

09.06.2015, 21:51. Показов 7968. Ответов 9
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Читая про приведение типов из msdn наткнулся на фразу
Неявные преобразования. Не требуется никакого специального синтаксиса, поскольку преобразование безопасно для типов и данные не теряются. Примерами могут служить преобразования от меньшего к большему целому типу, и преобразования из производных классов в базовые классы.
Этого я, признаюсь, не понял. Производные классы имеют все те же поля и методы, что и базовые + свои собственные, то есть если неявно преобразовать производный к базовому, разве не будут потеряны данные экземпляра класса хранящиеся в его "производных" полях ?
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
09.06.2015, 21:51
Ответы с готовыми решениями:

Нахождение ошибки в наследовании и приведении типов
имеется рабочий код на с++, пыталась переделать его в С#, возникают ошибки,которые я не в состоянии сама исправить. Буду безумно...

FormatException не обработано при приведении типов
Надоело, просто жесть как надоело: err = Convert.ToInt32(hgg); ferrors = err; Ну что здесь не правильно? Студия...

Как вызвать метод дочернего класса при приведении типов?
Привет у меня есть класс (Батя) и парочка дочерних классов в классе Батя есть метод void Verefication, который унаследовали все его...

9
Эксперт .NET
 Аватар для insite2012
5548 / 4311 / 1218
Регистрация: 12.10.2013
Сообщений: 12,371
Записей в блоге: 2
09.06.2015, 22:09
Цитата Сообщение от Tini Посмотреть сообщение
разве не будут потеряны данные экземпляра класса хранящиеся в его "производных" полях ?
В смысле потеряны? Класс-наследник одновременно является и базовым, то есть имеет поля/свойства/методы, определенные в базовом классе (public/protected) плюс свои. При таком приведении типов (из наследника к базовому) по получившейся ссылке станут недоступны все собственные члены реализации, а те что унаследованы от базового класса останутся доступны.
Для того чтобы собственные члены стали снова доступны, потребуется уже явное приведение от базового класса-к наследнику.
1
Эксперт .NETАвтор FAQ
 Аватар для Storm23
10427 / 5157 / 1825
Регистрация: 11.01.2015
Сообщений: 6,226
Записей в блоге: 34
09.06.2015, 22:10
Tini, Если вы создали объекта класса Foo, то он всегда будет храниться в памяти как объект класса Foo, со всеми своими полями, независимо от преобразований типа.
Преобразования типа вообще не меняют объект в памяти. Преобразования типа просто говорят компилятору какие методы можно применять к ссылке на объект, а какие нельзя. То что вы напишите
C#
1
2
Foo foo = new Foo();
Boo boo = (Boo)foo;
Означает лишь то, что у boo можно вызывать лишь те методы, которые есть у Boo. Сам же объект как был Foo, так им и остается.
(Все это конечно не касается преобразования классов, у которых явно заданы операторы преобразования типа. В этих операторах, вы можете создавать объекты другого класса при преобразовании)
1
52 / 13 / 0
Регистрация: 05.09.2014
Сообщений: 92
10.06.2015, 00:00  [ТС]
Да, кое-что я неправильно понимал. Производный объект не меняется, а просто создается новый объект базового класса. Но все же: в описании неявного преобразования написано, что данные не теряются. Ну например:
C#
1
2
3
4
5
6
7
8
9
10
public class человек
{
private string Имя;
private string Фамилия;
private int Возраст;
}
public class родитель : человек
{
private int дети;
}
Не придирайтесь, код без конструкторов и методов. Человек - это базовый класс, родитель - производный. То есть по аналогии примера Storm23 код
C#
1
2
родитель Миша_папа=new родитель();
человек просто_Миша=Миша_папа;
является неявным преобразованием, но ведь поле "дети" станет недоступным у класса "человек", а разве это не потеря данных ? То есть данные "дети" были, а после неявного приведения их не стало. Чего я не понимаю ?
0
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
10.06.2015, 00:04
Цитата Сообщение от Tini Посмотреть сообщение
преобразования из производных классов в базовые классы.
Тут надо понимать, что речь идет не об объектах, а о переменных.

Переменная — это место для хранения данных.
Переменная может быть значимого или ссылочного типа.
В переменной значимого типа хранится непосредственно объект (значение), в переменной ссылочного типа хранится ссылка на объект.
Применительно к переменным ссылочного типа процитированая вами часть документации говорит лишь о том, что переменная ссылочного типа А может хранить ссылку на объект типа Б при условии, что тип Б наследуется от А.

Сами объекты, на которые хранится ссылка в переменной, при этом, разумеется, не изменяются.
1
52 / 13 / 0
Регистрация: 05.09.2014
Сообщений: 92
10.06.2015, 00:22  [ТС]
То есть в моем примере просто_Миша и Миша_папа - это две ссылки на один и тот же объект, только в первом случае это объект базового класса, а во втором - производного ?
0
9933 / 2936 / 494
Регистрация: 05.10.2013
Сообщений: 7,968
Записей в блоге: 233
10.06.2015, 00:56
Представьте, что Миша_папа поехал без Иры_мамы на курорт и там он стал просто_Миша. Ему на время курорта не нужны данные дети

Добавлено через 3 минуты
Это не очень хороший пример..., но наверное такое бывает
1
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
10.06.2015, 01:06
Лучший ответ Сообщение было отмечено Tini как решение

Решение

Цитата Сообщение от Tini Посмотреть сообщение
в моем примере просто_Миша и Миша_папа - это две ссылки на один и тот же объект
Совершенно верно.

Цитата Сообщение от Tini Посмотреть сообщение
в первом случае это объект базового класса, а во втором - производного ?
Не объект, а переменная.
Объект — это сама сущность, переменная (ссылочного типа) — это место, в котором хранится ссылка на объект.
2
52 / 13 / 0
Регистрация: 05.09.2014
Сообщений: 92
10.06.2015, 01:44  [ТС]
Спасибо, проверил, действительно. При смене поля у первого, сменилось поле и у второго.
0
9933 / 2936 / 494
Регистрация: 05.10.2013
Сообщений: 7,968
Записей в блоге: 233
10.06.2015, 02:12
Лучший ответ Сообщение было отмечено Tini как решение

Решение

Цитата Сообщение от Tini Посмотреть сообщение
является неявным преобразованием, но ведь поле "дети" станет недоступным у класса "человек", а разве это не потеря данных ? То есть данные "дети" были, а после неявного приведения их не стало. Чего я не понимаю ?
После upcast'а (после приведения к базовому) члены из производного класса перестают быть доступными, но не теряются, так как вы в любой момент можете явно downcast'ить (приводиться) обратно к производному. Просто после upcast'а члены производного класса на время скрываются
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
10.06.2015, 02:12
Помогаю со студенческими работами здесь

Почему при восходящем приведении типов вызывается метод класса потомка?
class T1 { public virtual void P() { Console.WriteLine(1); } } class T2 : T1 {

Необработанное исключение типа "System.FormatException" при приведении типов
Не работает с double double prais; private void F() { switch(cBox.SelectedIndex) { ...

Изменение значения при приведении типов
Привет форумчане! Вот часть программы: u = 64000; s = (short) u; console.Writeline("s после присвоения 64000: " + u +...

Ошибка в приведении типов
Здравствуйте. Я недавно начал самостоятельно изучать программирование Win32 приложений, и у меня стабильно возникает похожая ошибка:...

Ну жна помощь в приведении типов
Никак не могу понять как работает приведение типов. В первую очередь про dynamic_cast. Допустим у нас есть такая часть программы ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru