быдлокодер
1721 / 908 / 106
Регистрация: 04.06.2008
Сообщений: 5,643
1

Ссылается ли на экземпляр производного класса переменная родительского типа в приведенном коде

25.12.2012, 00:21. Показов 974. Ответов 10
Метки нет (Все метки)

Гербердт Шилдт не поленился, два раза повторил:

"по ссылке на объект базового класса можно обращаться к объекту производного класса" и привёл пример подобному ниже. Я ничё не понимаю, это ведь значит только одно, если нам нужна ссылка на производный класс, мы условно говоря, можем заменить её ссылкой на базовый класс. НО НЕ НАОБОРОТ

А в этом компилящемся примере как раз наоборот и происходит :

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
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
 
namespace ConsoleApplication21
{
    class Program
    {
        public class b
        {
            public b() {}
            public b(b b_) { }
        }
 
        public class p:b
        {
            public p() { }
            
       //Вот тут , конструктор ожидает ссылку на базовый класс, 
       //а мы передаём ему ссылку на производный класс
        public p(p p_):base(p_) { }
        }
        
        static void Main(string[] args)
        {
            b b_0 = new b(   );
            b b_1 = new b(b_0);
 
            //++++++++++++++++++++++++++++++++++
 
            p p_0 = new p();
            p p_1 = new p(p_0);
        }
    }
}
Гениально, прямо как так и надо будто бы. Помогите разобраться, коме не лень! Спасибо заранее.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
25.12.2012, 00:21
Ответы с готовыми решениями:

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

Создание указателя типа базового класса на экземпляр производного класса
Добрый день! Иногда видел коды, где создавался указатель типа базового класса на объект класса -...

Выкидывает из программы при попытке создать экземпляр производного класса
Всем привет) Проблема в функции menu(), там, где закомментированы 3 первые строки. При попытке...

Является ли переменная в приведенном коде - указателем?
Есть следующая строк кода: MyClass ob = new MyClass() Правильно ли я понимаю, что переменная...

10
Эксперт .NET
16136 / 12137 / 3189
Регистрация: 17.09.2011
Сообщений: 20,215
25.12.2012, 00:25 2
Нет, в примере все правильно и по книжке: на экземпляр производного класса ссылается переменная родительского типа.
0
быдлокодер
1721 / 908 / 106
Регистрация: 04.06.2008
Сообщений: 5,643
25.12.2012, 01:01  [ТС] 3
Цитата Сообщение от kolorotur Посмотреть сообщение
Нет, в примере все правильно и по книжке: на экземпляр производного класса ссылается переменная родительского типа.
а имя переменной можно узнать?
0
Эксперт .NET
16136 / 12137 / 3189
Регистрация: 17.09.2011
Сообщений: 20,215
25.12.2012, 11:26 4
Цитата Сообщение от kravam Посмотреть сообщение
а имя переменной можно узнать?
Мы же про конструкторы говорим, правильно?
Конструктор класса b принимает аргументом ссылку на экземпляр класса b.
В конструкторе унаследованного класса p вы передаете конструктору класса b ссылку на экземпляр класса p.
В результате переменная b_ родительского конструктора ссылается на экземпляр класса p, то есть получается что-то вроде этого:
C#
1
2
p p_ = new p(); // Эта ссылка передается в конструктор класса p
b b_ = p_; // А это происходит при вызове base(p_)
То есть все согласно тому, что написано в книжке.
Имена классов и переменных, правда, идиотские, потому затрудняют восприятие и понимание.
0
быдлокодер
1721 / 908 / 106
Регистрация: 04.06.2008
Сообщений: 5,643
25.12.2012, 12:16  [ТС] 5
Цитата Сообщение от kolorotur Посмотреть сообщение
Конструктор класса b принимает аргументом ссылку на экземпляр класса b.
В конструкторе унаследованного класса p вы передаете конструктору класса b ссылку на экземпляр класса p.
Так вы вывод-то из этих своих слов сделайте; то есть мы вместо ссылки (ожидаемой) на базовый класс подсовываем ссылку на производный. Так, нет?
0
Эксперт .NET
16136 / 12137 / 3189
Регистрация: 17.09.2011
Сообщений: 20,215
25.12.2012, 12:21 6
Цитата Сообщение от kravam Посмотреть сообщение
Так вы вывод-то из этих своих слов сделайте; то есть мы вместо ссылки (ожидаемой) на базовый класс подсовываем ссылку на производный. Так, нет?
Я же это прямым текстом написал - какие выводы?
Да, так.
0
быдлокодер
1721 / 908 / 106
Регистрация: 04.06.2008
Сообщений: 5,643
25.12.2012, 15:04  [ТС] 7
Ну вот. А мы не имеем права вместо ссылки на базовый класс использовать ссылку на производный класс. Вот и всё, собсно. Вот таблица:

[table= "option1='ссылку на базовый класс','НЕ МОЖЕМ заменить ссылкой на производный класс';
option2='ссылку на производный класс','МОЖЕМ заменить ссылкой на базовый класс'"]

в общем нарушаем первую строку этой таблицы
0
Эксперт .NET
16136 / 12137 / 3189
Регистрация: 17.09.2011
Сообщений: 20,215
25.12.2012, 15:16 8
Цитата Сообщение от kravam Посмотреть сообщение
А мы не имеем права вместо ссылки на базовый класс использовать ссылку на производный класс.
Не так.
Мы не можем (без явного приведения) использовать переменную производного типа для ссылания на базовый класс.
В приведенном вами примере все наоборот - переменная базового типа используется для ссылания на производный класс, что позволяется делать без явного приведения типов, потому все ок.
Вот аналогичный пример:
C#
1
2
3
4
5
6
void Foo(object obj) {}
void Main()
{
   string str = "Hello world";
   Foo(str); // OK
}
То же самое происходит и в вашем примере: имеется переменная obj базового типа и ей присваивается объект типа string, на который ссылается переменная str.
То есть никакого противоречия или нарушения правил.
0
быдлокодер
1721 / 908 / 106
Регистрация: 04.06.2008
Сообщений: 5,643
25.12.2012, 16:18  [ТС] 9
Ему надо было в форулировках аккуратнее быть. Примерно так сказать:

Мы можем делать так, чтобы переменная типа "ссылка на элемент базового класса" ссылалась на переменную типа "ссылка на элемент производного класса" без явного приведения типа.
И способы, какими можно это достигнуть:
C#
1
object obj= new string ();
Ну и ваш пример. Где обязательно сказать, что передавать можно АБЫ ЧТО, лишь бы принялось. И объяснить, что в Foo значением obj (хотя она там не используется, но тем не менее) будет ссылка на str.
0
Эксперт .NET
16136 / 12137 / 3189
Регистрация: 17.09.2011
Сообщений: 20,215
25.12.2012, 18:20 10
Цитата Сообщение от kravam Посмотреть сообщение
Ему надо было в форулировках аккуратнее быть.
Шилдта не читал, но уже не первый раз обращаю внимание на проблемы у людей с пониманием его объяснений, а особенно - примеров.
Что ни тема с просьбой пояснить чего Шилдт имел в виду, то сразу вспоминается вот эта картинка:
Ссылается ли на экземпляр производного класса переменная родительского типа в приведенном коде
1
kravam
25.12.2012, 19:10  [ТС]     Ссылается ли на экземпляр производного класса переменная родительского типа в приведенном коде
  #11

Не по теме:

Особо не замечал за ним ничё такого (мне легче понять его, ибо многое знакомо из C++), но тут прямо ступор какой-то нашёл.

0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
25.12.2012, 19:10

Передача типа из производного класса в родительский
Добрый день! Есть код: template<typename T> struct Base { void test(typename T::Axis aaa)...

Приведение переменной типа object к переменной производного типа в приложенном коде
Добрый день! Столкнулся с проблемой. Есть обработчик события. Обработчик события общий для двух...

Выделить в приведенном коде три класса
помогите разбить этод код на 3-х классов (основная, игры и игрока) package hw2; import...

Какой смысл класса MyException в приведенном коде
Какой смысл от метода Х2 и класса MyException? using System; using System.Collections.Generic;...


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

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2022, CyberForum.ru