Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.50/98: Рейтинг темы: голосов - 98, средняя оценка - 4.50
28 / 24 / 2
Регистрация: 11.12.2012
Сообщений: 448

Приведение базового класса к производному

15.02.2013, 11:25. Показов 17927. Ответов 8
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Просмотрел код из учебника Шилдта
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
using System; 
class X { 
public int Val; 
} 
// Класс Y, производный от класса X. 
class Y : X { } 
// Этот делегат возвращает объект класса X и 
// принимает объект класса Y в качестве аргумента. 
delegate X Changelt(Y obj); 
class CoContraVariance { 
// Этот метод возвращает объект класса X и 
// имеет объект класса X в качестве параметра, 
static X IncrA(X obj) { 
X temp = new X(); 
temp.Val = obj.Val + 1; 
return temp; 
} 
// Этот метод возвращает объект класса Y и 
// имеет объект класса Y в качестве параметра. 
static Y IncrB(Y obj) { 
Y temp = new Y() ; 
temp.Val = obj.Val + 1; 
return temp; 
} 
static void Main() { 
Y Yob = new Y(); 
// В данном случае параметром метода IncrA является объект класса X, 
//а параметром делегата Changelt — объект класса Y. Но благодаря 
// контравариантности следующая строка кода вполне допустима. 
Changelt change = IncrA; 
X Xob = change(Yob); 
Console.WriteLine("Xob: " + Xob.Val); 
// В этом случае возвращаемым типом метода IncrB служит объект класса Y, 
//а возвращаемым типом делегата Changelt — объект класса X. Но благодаря 
// ковариантности следующая строка кода оказывается вполне допустимой, 
change = IncrB; 
Yob = (Y) change(Yob); 
Console.WriteLine("Yob: " + Yob.Val); 
} 
}
Увидел неявное преобразование базового класса к производному
C#
1
Yob = (Y) change(Yob);
Сам решил проделать такое
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
using System;
class Base
{
    protected int x = 5, y = -8;
    public void show()
    {
        Console.WriteLine("xb = " + x + " yb = " + y);
    }
}
class Proiz : Base
{
}
class D
{
    static void Main()
    {
        Proiz objp = new Proiz();
        Base objb = new Base();
        objp = (Proiz)objb;
    }
}
Но вылетает необработанное исключение System.InvalidCastException. Почему у Шилдта получается, а у меня - нет?
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
15.02.2013, 11:25
Ответы с готовыми решениями:

Приведение базового класса к наследнику
Допустим, есть такие классы class First { public string fieldFirst; } class Second:First { public string fieldSecond; }Из...

Создание экземпляра класса-наследника для переменной с типом базового класса
Подскажите чайнику как создается экземпляр класса BC BaseClass BC = new DerivedClass(); Вопрос: BC - это экземпляр класса BaseClass...

Как обратиться из конструктора базового абстрактного класса к свойству-массиву класса наследника
Добрый день. Подскажите как обратиться из конструктора базового абстрактного класса к свойству-массиву из класса наследника. Вроде бы...

8
Темная сторона .Net
 Аватар для Noob.net
592 / 489 / 39
Регистрация: 21.07.2012
Сообщений: 1,668
15.02.2013, 11:27
Euroman, Потому что у Шилдта ЙОБ - экземпляр Y - класса,к которому приводят,а у тебя
C#
1
2
3
4
5
Base objb = new Base();
        objp = (Proiz)objb;
//еще раз у Шилдта
Proiz objb = new Base();
        objp = (Proiz)objb; а у тебя - смотреть выше
0
28 / 24 / 2
Регистрация: 11.12.2012
Сообщений: 448
15.02.2013, 12:03  [ТС]
Цитата Сообщение от Noob.net Посмотреть сообщение
ЙОБ

Как-то не очень понял, я не то же самое проделал?
У Шидлта возвращается базовый класс
C#
1
change(Yob)
, который неявно преобразуется в производный, ну и присваивается производному классу. А у меня что тогда не так?
0
Темная сторона .Net
 Аватар для Noob.net
592 / 489 / 39
Регистрация: 21.07.2012
Сообщений: 1,668
15.02.2013, 12:14
Euroman, А вы пытаетесь преобразовать (это явно называется,когда с (БазовыйКласс) ) производный класс в базовый в объект,который может содержать в себе только производный.. Фуухх..аж сам запутался..
C#
1
2
3
Base objb = new Base();  objp = (Proiz)objb; 
//Тип objp - Base(производный),а вы хотите преобразовать в 
//Proiz(базовый) - так нельзя
0
28 / 24 / 2
Регистрация: 11.12.2012
Сообщений: 448
15.02.2013, 12:22  [ТС]
Я ступил, имел ввиду явно. Я понимаю, что неявно можно к базовому классу присвоить производный(base=proiz). Но у меня же явно преобразуется базовый класс к производному, как у Шилдта, но почему-то вылетает исключение(proiz = (proiz)base).

Добавлено через 2 минуты
Цитата Сообщение от Noob.net Посмотреть сообщение
Euroman, А вы пытаетесь преобразовать (это явно называется,когда с (БазовыйКласс) ) производный класс в базовый в объект,который может содержать в себе только производный.. Фуухх..аж сам запутался..
C#
1
2
3
Base objb = new Base();  objp = (Proiz)objb; 
//Тип objp - Base(производный),а вы хотите преобразовать в 
//Proiz(базовый) - так нельзя
Ну так все правильно написано proiz = (proiz)base
0
Темная сторона .Net
 Аватар для Noob.net
592 / 489 / 39
Регистрация: 21.07.2012
Сообщений: 1,668
15.02.2013, 13:38
Euroman, Насчет явно,=) исправился.
Вся твоя проблема в названия экземпляров класса типа - объект "Х Три1000-иКамон" класса "Дерево",почему не назвать Дуб! или Клен! или дерево!,да хотя бы дерево1.

Еще раз по порядку
Кликните здесь для просмотра всего текста
C#
1
2
3
4
5
Proiz Объект_производного_класса = new Proiz(); //никогда не пиши русскими в шарпе. 
        Base Объект_базового_класса = new Base();
        Объект_производного_класса = (Proiz)Объект_базового_класса;//это у тебя.
        Объект_базового_класса = (Proiz)Объект_производного_класса;//а у шилдта - понял?
//Девочку по имени Катя ты можешь назвать Девочкой,но сказать что Любую Девочку зовут Катя - нельзя!


Добавлено через 12 минут
Euroman, Шилдт здесь другое показывал. Пример сложный,как по мне.
Он говорит о контравариантности и ковариантности.
Полезная ссылка 1
Полезная ссылка 2
Полезная ссылка 3
Полезная ссылка - Сюда иди полюбому
0
28 / 24 / 2
Регистрация: 11.12.2012
Сообщений: 448
15.02.2013, 13:53  [ТС]
:faceplam:
Да Йоб же производный класс class Y : X { }
Y Yob = new Y();
А вы миллион раз городите, что он базовый. Для наглядности еще раз напишу.
class Y : X { }
class Y : X { }
class Y : X { }
class Y : X { }
0
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
15.02.2013, 14:10
Не надо путать приведение и конвертацию.
Приведение - это когда ссылка одного типа указывает на объект другого типа.
Конвертация - это когда один объект преобразуется совсем в другой объект (строка в число, например).
В примере Шилдта происходит приведение, т.к. создается экземпляр одного типа, но присваивается переменной другого типа, сам при этом в памяти оставаясь тем же экземпляром.
А вы в своем примере пытаетесь с помощью приведения произвести конвертацию, то есть преобразовать один объект в другой.

На примере строки и объекта.
Вот это происходит у Шилдта:
C#
1
2
3
string str = "Hello";
object obj = str; // Ссылка изменилась, но в памяти все равно строка.
string strX = (stting)obj; // OK, т.к. obj ссылается на строку
А вот что вы пытаетесь сделать:
C#
1
2
3
string str = "Hello";
object obj = new object();
string strX = (string)obj; // WTF?
2
28 / 24 / 2
Регистрация: 11.12.2012
Сообщений: 448
15.02.2013, 14:31  [ТС]
kolorotur, спасибо, более-менее понятно становится
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
15.02.2013, 14:31
Помогаю со студенческими работами здесь

Как сделать явное приведения переменной типа класса-наследника к типу базового класса?
Читал, что для этого нужно явное приведение к типу, но на практике выдаёт ошибку. Вот код: using System; using System.Linq; namespace...

Список дочернего класса привести к списку базового класса
Детский вопрос, но все же. есть классы: class Base { public string str = "base"; } class Dervie1 : Base ...

Обращение к полю производного класса по ссылке базового класса
Описывается базовый и производный класс. В методе Main создается объект производного класса и присваивается ссылке типа базового класса....

Использование метода из наследованного класса к объекту базового класса
Есть метод public void OpExp() { if (Person._age<18) Console.WriteLine("Вы не можете...

Класс: Создать на основе базового класса Car три класса-автомобиля: Тойота, Феррари, Бугатти.
Всем привет! На днях дали эту задачу, пытался делать по-разному не хоть убей не могу сделать. К сожалению я пропустил пары по классам. А по...


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

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Новые блоги и статьи
Программный контроль заполнения реквизита табличной части документа
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: реализовать контроль заполнения реквизита табличной части. . .
wmic не является внутренней или внешней командой
Maks 02.04.2026
Решение: DISM / Online / Add-Capability / CapabilityName:WMIC~~~~ Отсюда: https:/ / winitpro. ru/ index. php/ 2025/ 02/ 14/ komanda-wmic-ne-naydena/
Программная установка даты и запрет ее изменения
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: при создании документов установить период списания автоматически. . .
Вывод данных в справочнике через динамический список
Maks 01.04.2026
Реализация из решения ниже выполнена на примере нетипового справочника "Спецтехника" разработанного в конфигурации КА2. Задача: вывести данные из ТЧ нетипового документа. . .
Функция заполнения текстового поля в реквизите формы документа
Maks 01.04.2026
Алгоритм из решения ниже реализован на нетиповом документе "ВыдачаОборудованияНаСпецтехнику" разработанного в конфигурации КА2, в дополнении к предыдущему решению. На форме документа создается. . .
К слову об оптимизации
kumehtar 01.04.2026
Вспоминаю начало 2000-х, университет, когда я писал на Delphi. Тогда среди программистов на форумах активно обсуждали аккуратную работу с памятью: нужно было следить за переменными, вовремя. . .
Идея фильтра интернета (сервер = слой+фильтр).
Hrethgir 31.03.2026
Суть идеи заключается в том, чтобы запустить свой сервер, о чём я если честно мечтал давно и давно приобрёл книгу как это сделать. Но не было причин его запускать. Очумелые учёные напечатали на. . .
Модель здравосоХранения 6. ESG-повестка и устойчивое развитие; углублённый анализ кадрового бренда
anaschu 31.03.2026
В прикрепленном документе раздумья о том, как можно поменять модель в будущем
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru