Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.64/11: Рейтинг темы: голосов - 11, средняя оценка - 4.64
9 / 9 / 0
Регистрация: 27.01.2013
Сообщений: 248
1

В приведенном коде base может изменить значения членов базового класса в самом базовом классе

24.06.2014, 18:27. Просмотров 2116. Ответов 15
Метки нет (Все метки)


C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
using System;
class a
{
    public int x;
    public a()
    {
        x = 122;
    }
}
class b : a {public b() {base.x = 5;} } //здесь я изменяю переменную в базовом классе или ту которая мне передалась в наследство
class c : b { }
class d : c { public void Show() { Console.WriteLine(((a)this).x); } } // получается что base изменяет содержимое класса а ??
class e
{
    static void Main()
    {
        d D = new d();
        D.Show();
    }
}
Господа выручайте, совсем завис на наследовании.
По началу я решил, что наследование это скрытое "копирование" членов базового класса в класс потомок, но теперь я засомневался. Так как ключевое слово base творит чудеса. Ранее я писал вопрос о конструкторе с использованием base. Теперь наткнулся на пример приведенный в коде выше. Выходит что base может изменить значения членов базового класса в самом базовом классе. В таком случае наследование это не "копирование" класса. Вот возник тогда вопрос, наследование каким образом передает данные класса ?? Вопрос совсем ненормальный, но я завис !!! Помогите
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
24.06.2014, 18:27
Ответы с готовыми решениями:

Как обработать исключение из класса наследника в базовом классе
Добрый день. Пишу приложение Windows Forms на C#. У меня есть базовый класс, у которого есть: одно...

Обращение к методам базового класса (есть ли подобие base/super?)
Понятное дело, что можно обращаться к методам базового класса так: BaseClass::hisMethod(); Однако...

Использование методов класса в самом классе
Вообще есть класс нужно объедение все его методы в один метод. Пример: class Test{ public:...

В классе Vacancy не вызывается инициализатор базового класса
В данном коде пишет ошибку "В классе Vacancy не вызывается инициализатор базового класса". Как...

__________________
Помогаю в написании курсовых работ и дипломов здесь.
Записывайтесь на профессиональные курсы С#-разработчиков‌
15
Модератор
Эксперт .NET
5304 / 4100 / 1183
Регистрация: 12.10.2013
Сообщений: 11,909
Записей в блоге: 2
24.06.2014, 18:37 2
bazyzy, я бы посоветовал для большей разборчивости писать код согласно принятым правилам... Читать такой винегрет просто противно, если честно...
0
Эксперт .NET
14852 / 11239 / 2949
Регистрация: 17.09.2011
Сообщений: 18,824
24.06.2014, 18:44 3
Цитата Сообщение от bazyzy Посмотреть сообщение
Выходит что base может изменить значения членов базового класса в самом базовом классе.
Вы, похоже, немного запутались в понятиях, так что давайте для начала их "распутаем".
Дайте, пожалуйста, краткие определения следующим терминам:
1. Класс
2. Объект
3. Член класса
4. Поле
5. Метод
6. Ссылка

Разберемся с понятиями и будем топать уже оттуда.

Добавлено через 6 минут
Еще один пунктик добавлю:
7. Конструктор
4
9 / 9 / 0
Регистрация: 27.01.2013
Сообщений: 248
24.06.2014, 18:47  [ТС] 4
1 Класс - чертеж будущего объекта
2 Объект воплощение этого чертежа в памяти
3 Любые данные в классе (методы, поля, свойства события итд)
4 Поле - переменные в классе
5 Набор иструкций манипулирующий полями и членами данных
6 Адрес на объект в памяти
7 Инициализатор полей, и указывает первые шаги при создании объекта
1
Эксперт .NET
14852 / 11239 / 2949
Регистрация: 17.09.2011
Сообщений: 18,824
24.06.2014, 19:37 5
Лучший ответ Сообщение было отмечено bazyzy как решение

Решение

bazyzy, отлично, пять баллов!

Цитата Сообщение от bazyzy Посмотреть сообщение
1 Класс - чертеж будущего объекта
Видите, уже из этого определения видно, что фраза "я изменяю переменную в базовом классе" не имеет смысла, так как класс — это чертеж1. Переменную (а точнее — ее значение) можно изменить в экземпляре класса, то есть в объекте, который хранится непосредственно в памяти. А в чертеже объект ничего изменить не может.

Что означает "класс А наследуется от класса Б"? Это значит, что вы берете уже готовый чертеж А и на его основе рисуете новый чертеж Б.
Что значит "на его основе"? Это значит, что чертеж Б будет включать в себя все, что есть в А плюс, возможно, что-то новое, то есть Б — это А с блэкджеком и дополнительными членами.
Вся суть наследования заключается в том, чтобы не копировать код уже существующего класса, если надо в него добавить что-нибудь новое.

Что в этом контексте означает ключевое слово base? Оно означает "получить доступ к принадлежащему мне члену, который является не чем-то новым в чертеже, по которому я создан, а позаимствованным при копировании другого чертежа, принятого за основу моего".
В вашем случае поле х изначально объявлено в классе А. При создании класса Б это поле стало его членом, как если бы вы написали:
C#
1
2
3
4
class b
{
   public int x;
}
То есть в данном случае обращение к переменной х через base не играет никакой роли — вы обращаетесь к собственной переменной класса Б, просто объявлена она была в родительском классе и досталась вам по наследству, а вы на это явно указали.

В методе Show класса d вы делаете то же самое: явно указываете, что принадлежащая классу d переменная x изначально была создана в классе a и перекочевала в него через цепочку наследований.

1Да-да, класс — это тоже объект. Давайте детали реализации рантайма оставим в стороне.
2
9 / 9 / 0
Регистрация: 27.01.2013
Сообщений: 248
24.06.2014, 20:52  [ТС] 6
Уважаемый форумчанин, я очень благодарю за ответ !!!! Спасибо, что внесли ясность в мою больную фантазию. Теперь я разобрался !!

Добавлено через 47 минут
Вот такой я пока что вывод сделал. Зацените пожалуйста )))

Использование base конструктора с параметрами

1. Базовому классу передаются через base-конструктор параметры от класса потомка
2. Из-за этого базовый класс инициализирует свои поля в соответствии аргументами переданными от потомка
3. И уже с инициализированными полями базовый класс наследуется

Использование base как обращение к переменной

1. Если через base происходит изменение значения переменной, тогда эта переменная изменяется в базовом классе
2. И потом идет заново наследование с измененной переменной
0
Эксперт .NET
14852 / 11239 / 2949
Регистрация: 17.09.2011
Сообщений: 18,824
24.06.2014, 21:32 7
Лучший ответ Сообщение было отмечено bazyzy как решение

Решение

Цитата Сообщение от bazyzy Посмотреть сообщение
1. Базовому классу передаются через base-конструктор параметры от класса потомка
Нет, классу ничего передаваться не может — это же чертеж, вы сами сказали.
Просто вызывается конструктор, изначально созданный в базовом классе.

Цитата Сообщение от bazyzy Посмотреть сообщение
2. Из-за этого базовый класс инициализирует свои поля в соответствии аргументами переданными от потомка
Нет, базовый класс ничего инициализировать не может. Да и никакой другой класс тоже. Точно так же, как не может ездить и бибикать чертеж автомобиля.
Свои поля инициализирует сам объект, который в данный момент создается.

Цитата Сообщение от bazyzy Посмотреть сообщение
3. И уже с инициализированными полями базовый класс наследуется
Наследуется класс тогда, когда компилируется.
То есть в тот момент, когда код даже еще не выполняется.

Цитата Сообщение от bazyzy Посмотреть сообщение
1. Если через base происходит изменение значения переменной, тогда эта переменная изменяется в базовом классе
Нет, переменная изменяется в текущем объекте, так как ему принадлежит.

Цитата Сообщение от bazyzy Посмотреть сообщение
2. И потом идет заново наследование с измененной переменной
Снова нет.

Еще раз внимательно прочитайте мое предыдущее сообщение.
Если не понятно — спрашивайте
1
9 / 9 / 0
Регистрация: 27.01.2013
Сообщений: 248
24.06.2014, 22:22  [ТС] 8
Спасибо большое, что нашли возможность ответить. Еще есть небольшой вопрос. Что касается base конструктора я вроде как разобрался. Но теперь не пойму относительно base переменной. Я вот код небольшой написал
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
using System;
class a
{
    public int x = 699;
}
class b : a
{
    public void VALUE()
    {
        x = 3;
    }
    public void View()
    {
        Console.WriteLine(((a)this).x);
    }
}
class c
{
    static void Main()
    {
        b B = new b();
        B.VALUE();
        B.View();
    }
}
В упор не могу понять, почему значение х меняется в объекте а ?? Ведь если при наследовании код как бы копируется (понятно что это не совсем так), тогда переменная не должна измениться в базовом объекте. То есть получается , что мы в методе VALUE() изменяем переменную в объекте а и от этого изменяется значение этой переменной как в базовом так и дочернем объектах. Но из-за чего это происходит ?
0
304 / 281 / 102
Регистрация: 06.05.2014
Сообщений: 861
24.06.2014, 22:43 9
Да нет никакого "базового объекта"! Объект создаётся один и это объекта класса b. А он в свою очередь наследует все члены базового класса a.
В данном случае при создании объекта B в момент инициализации, объекту было присвоено поле x от базового класса и во время вызова конструктора эта переменная равна 699. Когда ты вызывал метод VALUE, то изменил значение этого поля на 3.
А то, что ты думаешь, что после этой записи: ((a)this).x ты якобы вызываешь значение поля x объекта класса a, то ты ошибаешься - это приведение типа, т.е. ты привёл объект B класса b к типу класса a - не более.
В данном примере x - везде одна и та же переменная и адрес в памяти у неё один и тот же. И относится она к объекту B.
2
9 / 9 / 0
Регистрация: 27.01.2013
Сообщений: 248
25.06.2014, 15:20  [ТС] 10
Цитата Сообщение от BozKurt Посмотреть сообщение
В данном примере x - везде одна и та же переменная и адрес в памяти у неё один и тот же. И относится она к объекту B.
Вы наверное хотели сказать объекту А ??
Если я правильно все понял, то переменная х объявленная в классе а везде одна и та же, а не в В одна ее копия в А другая. То есть когда я создаю объект класса В переменная х выходит как общая для А И В ?? И если бы был класс G который наследовался бы от B то эта переменная была бы общей для A , B , G правильно ли я понял ??
0
Эксперт .NET
14852 / 11239 / 2949
Регистрация: 17.09.2011
Сообщений: 18,824
25.06.2014, 15:42 11
Цитата Сообщение от bazyzy Посмотреть сообщение
в В одна ее копия в А другая.
Именно так.
Объект типа В абсолютно никак не связан с объектом типа А. У них нет абсолютно ничего общего, они не пересекаются.
1
9 / 9 / 0
Регистрация: 27.01.2013
Сообщений: 248
25.06.2014, 15:58  [ТС] 12
Но если я создаю объект В наследуемый от А, то выходит, что переменная х одна на эти оба класса (если объявлена она изначально была в А), правильно ???
0
304 / 281 / 102
Регистрация: 06.05.2014
Сообщений: 861
25.06.2014, 16:11 13
Цитата Сообщение от bazyzy Посмотреть сообщение
Но если я создаю объект В наследуемый от А
Во-первых, объекты ничего не наследуют. Во-вторых, покажи где ты создаёшь объект А?
Если ты создаешь объект класса b, который в свою очередь наследуется от класса a, то в памяти будет создан один объект и тип у него будет b, и в этом объекте будет член x, и это одна переменная в памяти, не две, не полторы, а одна, с одним и тем же адресом, и принадлежит эта переменная именно объекту B!

Добавлено через 2 минуты
Я понял в чём твоя проблема: ты напрочь не разделяешь понятия объект и класс, хотя и знаешь как они называются.
P.S. И почитай про наследование конструкторов: >>ClicK Me<<.
1
9 / 9 / 0
Регистрация: 27.01.2013
Сообщений: 248
25.06.2014, 16:21  [ТС] 14
Да уж моя тупость не имеет границ. Спасибо за ответ. Но все же хочу спросить дальше
Вот код
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
using System;
class a
{
    public int x = 90;
}
class b : a
{
 
}
class c : b
{
 
}
class MAIN
{
    static void Main()
    {
        c C = new c(); // создал объект в котором содержится переменная х унаследованная от b которая там появилась от a
    }
}
Я создал объект класса с унаследованный от класса b, естественно в нем есть переменная х (который забрал ее из класса а). Так вот вопрос мой в том, что когда я создаю объект С эта переменная х является копией переменной из класса b (или а) или при создании объекта С классы a, b, c объеденяются в один объект и эта переменная становится общей ???
Уж простите меня, вообще крыша поехала. Я раньше думал, что при наследовании код просто как бы копируется (кроме конструктора) от базы к потомку попутно инициализирую переменные, а он теперь как я понял не копируется а как бы расширяется и дополняется.
0
Эксперт .NET
14852 / 11239 / 2949
Регистрация: 17.09.2011
Сообщений: 18,824
25.06.2014, 16:29 15
bazyzy
Вот такая структура классов:
C#
1
2
3
4
5
6
7
class a
{
   public int x;
}
class b : a { }
class c : b { }
class d : c { }
Полностью соответствует вот такой:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
class a
{
   public int x;
}
class b
{
   public int x;
}
class c
{
   public int x;
}
class d
{
   public int x;
}
1
9 / 9 / 0
Регистрация: 27.01.2013
Сообщений: 248
25.06.2014, 16:50  [ТС] 16
Все господа разобрался !!! Всем спасибо за участие !!
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
25.06.2014, 16:50

Заказываю контрольные, курсовые, дипломные работы и диссертации здесь или здесь.

Инициализация в производном классе переменной из базового класса
Привет подскажите пожалуйста, как правильно реализовать такое. Есть член переменная базового...

Убрать метод базового класса в наследуемом классе
/** * base */ class baseClass { public function disMe() { echo &quot;I'm here&lt;br&gt;&quot;; } ...

Использование переменных базового класса в дочернем классе
Доброго времени суток. Подскажите пожалуйста как в классе SumbString работать с переменными(string...

В наследнике не видно членов базового класса
в чем ошибка кто подскажет? )).... val не видит #include&lt;iostream&gt; #include&lt;conio.h&gt; using...

Можно ли инстанцирование класса прописать в самом классе?
Можно ли инстанцирование класса прописать в самом классе?

Как убрать свойства базового класса в классе-потомке?
пишу свой контрол для winforms в моем контроле не будет столько свойств как в контроле usercontrol...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.