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

Как работает преобразование из типа класса в другой тип?

06.06.2018, 17:49. Показов 1680. Ответов 12
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Есть класс Test1 и наследуемый от него класс Test2.
C#
1
Test1 x = new Test2();
Типу какого класса теперь принадлежит переменная x. Читал, что при преобразовании переменная содержит ссылку на тип этого класса или любого производного класса (как я понял, на тип класса после new). И зачем вообще делается преобразование?
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
06.06.2018, 17:49
Ответы с готовыми решениями:

Преобразование типа int в тип bool невозможно
помогите плиз: int resultAB; resultAB=inputB-inputA; if (resultAB)>(2*inputE) { ...

Преобразование Массива типа String[] в тип Int[]
Есть код: string str; str = Console.ReadLine(); string str1 = str.Split(' '); Требуется преобразовать str1 в str2 типа INT. ...

Преобразование одного типа в другой
Привет. Проходил тему про преобразования одного типа в другой например это: static void Main() { A a = new B(); }

12
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
06.06.2018, 18:09
Цитата Сообщение от Vadim2411 Посмотреть сообщение
Типу какого класса теперь принадлежит переменная x.
Переменная х всегда принадлежит типу (имеет тип) Test.

Цитата Сообщение от Vadim2411 Посмотреть сообщение
Читал, что при преобразовании переменная содержит ссылку на тип этого класса или любого производного класса (как я понял, на тип класса после new).
Верно.
Только ссылка не на тип, а на экземпляр.

Цитата Сообщение от Vadim2411 Посмотреть сообщение
И зачем вообще делается преобразование?
Для возможности расширения типа без необходимости изменять уже существующий код.
0
 Аватар для Vadim2411
0 / 0 / 0
Регистрация: 10.05.2018
Сообщений: 64
06.06.2018, 18:30  [ТС]
Цитата Сообщение от kolorotur Посмотреть сообщение
Переменная х всегда принадлежит типу (имеет тип) Test.
Test1 или Test2?

Добавлено через 5 минут
Цитата Сообщение от kolorotur Посмотреть сообщение
Для возможности расширения типа без необходимости изменять уже существующий код.
T.e. при преобразовании переменная x получает дополнительно новые поля, методы и т.д., или те, которые у нее уже есть, заменяются на другие?
0
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
06.06.2018, 18:52
Цитата Сообщение от Vadim2411 Посмотреть сообщение
Test1 или Test2?
Test1.
Единичку не заметил.

Цитата Сообщение от Vadim2411 Посмотреть сообщение
T.e. при преобразовании переменная x получает дополнительно новые поля, методы и т.д., или те, которые у нее уже есть, заменяются на другие?
Нет.
Переменная в принципе не "получает" никаких полей или методов, она только хранит ссылку на экземпляр.
Переменная типа Т может хранить ссылку на любой экземпляр класса Т или его наследников.
0
189 / 166 / 101
Регистрация: 14.03.2018
Сообщений: 426
06.06.2018, 19:02
По ссылке на базовый класс можно ссылаться на его наследников. Сделано для поддержки динамического полиморфизма, чтобы, например, можно было пройтись по массиву разнообразных фигур и для каждой написать что-то вроде такого:
C#
1
figures[i].Draw();
И каждая фигура знает как себя правильно отображать, потому что метод Draw у каждой переопределён.
Но нужно учитывать, что следующий код выдаст Test2, так как ссылка на объект типа Test1 указывает на объект типа Test2:
C#
1
2
Test1 x = new Test2();
Console.WriteLine($"{x.GetType().Name}");
0
 Аватар для Vadim2411
0 / 0 / 0
Регистрация: 10.05.2018
Сообщений: 64
06.06.2018, 19:14  [ТС]
Цитата Сообщение от kolorotur Посмотреть сообщение
Переменная в принципе не "получает" никаких полей или методов, она только хранит ссылку на экземпляр.
Переменная типа Т может хранить ссылку на любой экземпляр класса Т или его наследников.
Не понимаю. Т.е. переменная x хранит ссылку на экземпляр типа Test2, но сама всё еще принадлежит типу Test1. Тогда к экземпляру какого типа я обращаюсь, обращаясь к переменной x?
0
189 / 166 / 101
Регистрация: 14.03.2018
Сообщений: 426
06.06.2018, 19:19
Цитата Сообщение от Vadim2411 Посмотреть сообщение
Что тогда получится в этом случае?
Ничего, метод private. Если бы был public, то true.

А вот так false:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public class Test1
{
    public virtual bool Method_1()
    {
        return true;
    }
}
 
public class Test2: Test1
{
    public override bool Method_1()
    {
        return false;
    }
}
1
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
06.06.2018, 19:28
Цитата Сообщение от Vadim2411 Посмотреть сообщение
Т.е. переменная x хранит ссылку на экземпляр типа Test2, но сама всё еще принадлежит типу Test1.
Верно.
Тип переменной не меняется после объявления, если это не dynamic.

Цитата Сообщение от Vadim2411 Посмотреть сообщение
Тогда к экземпляру какого типа я обращаюсь, обращаясь к переменной x?
К экземпляру типа Test2.
Однако, поскольку обращаетесь вы к нему через переменную типа Test1, компилятор не позволит вам написать код, в котором ведется обращение к членам, не объявленным в типе Test1 или его предках.
Для этого придется делать явное приведение к конкретному типу-наследнику.

Добавлено через 2 минуты

Не по теме:

VladPVS, это ответ на сообщение в другой теме или у меня голова под вечер уже не работает?

1
06.06.2018, 19:31

Не по теме:

kolorotur, нет, просто Vadim2411 сообщение отредактировал и стало не совсем понятно на что я отвечал.

0
 Аватар для Vadim2411
0 / 0 / 0
Регистрация: 10.05.2018
Сообщений: 64
06.06.2018, 19:33  [ТС]
Цитата Сообщение от VladPVS Посмотреть сообщение
По ссылке на базовый класс можно ссылаться на его наследников.
Т.е., сделав вот так
C#
1
Test1 x=new Test1();
я смогу наделать кучу классов-наследников от Test1 с переопределёнными методами и т.п и делать вот так
C#
1
Test1 x=new *Имя класса-наследника*();
а потом, не создавая новых переменных, я буду иметь доступ к членам классов-наследников через переменную x?
0
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
06.06.2018, 19:43
Цитата Сообщение от Vadim2411 Посмотреть сообщение
а потом, не создавая новых переменных, я буду иметь доступ к членам классов-наследников через переменную x?
Через переменную х — нет, не будете, если члены созданы новые, а не переопределены уже имеющиеся виртуальные.
Только если производить явное приведение к конкретному типу наследника.
1
 Аватар для Vadim2411
0 / 0 / 0
Регистрация: 10.05.2018
Сообщений: 64
06.06.2018, 20:12  [ТС]
Цитата Сообщение от kolorotur Посмотреть сообщение
Через переменную х — нет, не будете, если члены созданы новые, а не переопределены уже имеющиеся виртуальные.
Только если производить явное приведение к конкретному типу наследника.
Ок. Если подрезюмировать, то поверхностно можно сказать, что когда я создаю переменную x c типом класса Test1 и преобразую её к типу класса Test2 (наследника от Test1), переменная x с этого момента начинает хранить в себе ссылку на экземпляр типа Test2, и через неё я получаю доступ ко всему, что перешло при наследовании в Test2 от Test1, даже если это претерпело какие-либо изменения/переопределения, и я смогу снова преобразовывать переменную x к другим типам классов-наследников?
0
189 / 166 / 101
Регистрация: 14.03.2018
Сообщений: 426
06.06.2018, 20:26
Члены класса, доступные по ссылке, определяются типом ссылки, а не типом объекта, на который указывает ссылка.
Вот так
C#
1
2
Test1 x = new Test1();
Test2 y = (Test2)x;
сделать не получится, так как x ссылается на объект типа Test1.
(Нельзя экземпляр класса "Фигура" привести к классу "Квадрат", а вот наоборот - пожалуйста.)

А вот так уже можно:
C#
1
2
Test1 x = new Test2();
Test2 y = (Test2)x;
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
06.06.2018, 20:26
Помогаю со студенческими работами здесь

Преобразование 1 класса в другой
Подскажите возможно ли имея 2 одинаковых класс как ни буть приравнять один к другому Вариант через конструктор не нравится и явное...

Преобразование типа аргумента в тип класса и дружественная функция
Добрый день. Есть код: class Cls { private: double x; public: Cls(); Cls(double);

Как скопировать все свойства из одного класса в другой класс такого же типа
Здравствуйте. Представим, что есть класс со множеством свойств. Как скопировать все свойства из одного класса в другой, такого же типа....

Преобразование типа char в тип float
При считывании из файла чисел (каждое число расположено на новой строке, целая часть от дробной отделяется точкой). Использую функцию...

Как вызвать из одного класса (для метода типа void) метод типа boolean другого класса?
ребят, только учусь и конечно, вопросов возникает много. ситуация вот в чем. есть массив. я должна найти в i-том элементе какую-то...


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

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
Новые блоги и статьи
Модель заражения группы наркоманов
alhaos 17.04.2026
Условия задачи сформулированы тут Суть: - Группа наркоманов из 10 человек. - Только один инфицирован ВИЧ. - Колются одной иглой. - Колются раз в день. - Колются последовательно через. . .
Мысли в слух. Про "навсегда".
kumehtar 16.04.2026
Подумалось тут, что наверное очень глупо использовать во всяких своих установках понятие "навсегда". Это очень сильное понятие, и я только начинаю понимать край его смысла, не смотря на то что давно. . .
My Business CRM
MaGz GoLd 16.04.2026
Всем привет, недавно возникла потребность создать CRM, для личных нужд. Собственно программа предоставляет из себя базу данных клиентов, в которой можно фиксировать звонки, стадии сделки, а также. . .
Знаешь почему 90% людей редко бывают счастливыми?
kumehtar 14.04.2026
Потому что они ждут. Ждут выходных, ждут отпуска, ждут удачного момента. . . а удачный момент так и не приходит.
Фиксация колонок в отчете СКД
Maks 14.04.2026
Фиксация колонок в СКД отчета типа Таблица. Задача: зафиксировать три левых колонки в отчете. Процедура ПриКомпоновкеРезультата(ДокументРезультат, ДанныеРасшифровки, СтандартнаяОбработка) / / . . .
Настройки VS Code
Loafer 13.04.2026
{ "cmake. configureOnOpen": false, "diffEditor. ignoreTrimWhitespace": true, "editor. guides. bracketPairs": "active", "extensions. ignoreRecommendations": true, . . .
Оптимизация кода на разграничение прав доступа к элементам формы
Maks 13.04.2026
Алгоритм из решения ниже реализован на нетиповом документе, разработанного в конфигурации КА2. Задачи, как таковой, поставлено не было, проделанное ниже исключительно моя инициатива. Было так:. . .
Контроль заполнения и очистка дат в зависимости от значения перечислений
Maks 12.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: реализовать контроль корректности заполнения дат назначения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru