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

Ссылка одного типа на объекты другого

13.12.2013, 16:58. Показов 1420. Ответов 13
Метки нет (Все метки)

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
class Program
{
    static void Main(string[] args)
    {
        A b = new B();
        A c = new C();
        A d = new D();
 
        b.x = 10;
        c.x = 20;
        d.x = 30;
 
        Console.WriteLine("{0}\n{1}\n{2}\n",b.x, c.x, d.x);
        Console.ReadLine();
    }
}
 
class A
{
    public int x;
}
 
class B:A
{
    public int y;
}
 
class C:A
{
 
}
 
class D:A
{
 
}
Не могу понять как через ссылку типа A мы имеем доступ к переменной x для всех типов, но через ссылку типа А мы не имеем доступа к переменной y что в классе B. Ведь если класс B наследуется от А, тогда в классе B по умолчанию есть переменная x, такая же как и y. Почему же доступа к ней нет?
0

Помощь в написании контрольных, курсовых и дипломных работ здесь.

Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
13.12.2013, 16:58
Ответы с готовыми решениями:

Преобразование объектов одного класса в объекты другого
Есть сей код.Тут я пытаюсь осуществить преобразование объекта класса myCl к классу myCl2. Код...

Перенос данных из переменной одного типа в переменную другого типа
Добрый день! Одна часть программы размещает полученные данные(символы) в ПЕРЕМ1 типа ustring ( или...

Ссылка другого типа
Здравствуйте. Вопрос глупый, но подскажите в чем разница между такими ссылками: Two tеmp = new...

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

13
539 / 540 / 181
Регистрация: 16.03.2012
Сообщений: 1,160
Записей в блоге: 2
13.12.2013, 17:20 2
Цитата Сообщение от ccobbra Посмотреть сообщение
Ведь если класс B наследуется от А, тогда в классе B по умолчанию есть переменная x, такая же как и y. Почему же доступа к ней нет?
Переменная у есть только в классе В.
1
0 / 0 / 0
Регистрация: 08.02.2013
Сообщений: 111
13.12.2013, 17:21  [ТС] 3
Цитата Сообщение от buntar Посмотреть сообщение
Переменная у есть только в классе В.
Но через ссылку типа А мы получаем доступ к переменной x в классе B?
0
539 / 540 / 181
Регистрация: 16.03.2012
Сообщений: 1,160
Записей в блоге: 2
13.12.2013, 17:23 4
Цитата Сообщение от ccobbra Посмотреть сообщение
A b = new B();
В объекте родительского класса храним ссылку наследника.
для доступа к полю наследника в вашем случае:
C#
1
if(b is B) ((B)b).y = 12;
1
0 / 0 / 0
Регистрация: 08.02.2013
Сообщений: 111
13.12.2013, 17:27  [ТС] 5
Цитата Сообщение от buntar Посмотреть сообщение
В объекте родительского класса храним ссылку наследника.
для доступа к полю наследника в вашем случае:
C#
1
if(b is B) ((B)b).y = 12;
Мне не нужно знать как доступаться к полю, мне нужно знать почему к ней нет доступа через ссылку типа А. Ваши ответы вряд ли рассчитаны на новичков.
0
438 / 362 / 100
Регистрация: 29.06.2010
Сообщений: 981
Записей в блоге: 1
13.12.2013, 17:55 6
На момент написания программы компилятору неизвестно, что это за ссылки, что это объекты. Вот пример, как вы думаете, что должен сказать компилятор на такую конструкцию.


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
class A
{
    public int x;
}
 
class B:A
{
    public int y;
}
 
class C:A
{
  public int y1;
}
 
var aaa = new List<A>();
            aaa.Add(new B());
            aaa.Add(new C());
 
            foreach (var a1 in aaa)
            {
                a1.y1 = 5;
                a1.y = 10;
            }
Он скажет что не видит переменные у и у1, почему, потому что не знает о реальных типах в этих переменных. Для этого как вам уже показывали выше, нужно сделать так.

C#
1
2
3
4
5
6
7
8
9
10
11
var aaa = new List<A>();
            aaa.Add(new B());
            aaa.Add(new C());
 
            foreach (var a1 in aaa)
            {
                if(a1 is B)
                ((B)a1).y1 = 5;
                if(a1 is A)
                ((A)a1).y = 10;
            }
Еще один пример

C#
1
2
3
4
5
6
7
8
9
10
private static void Main(string[] args)
        {
            A c = new C();
            TestMethod(ref c);
        }
 
        private static void TestMethod(ref A a)
        {
            a = new B();
        }
Ссылка может просто поменяться.
1
Эксперт .NET
4341 / 2003 / 387
Регистрация: 27.03.2010
Сообщений: 5,460
Записей в блоге: 1
13.12.2013, 18:01 7
Лучший ответ Сообщение было отмечено как решение

Решение

Да фишка в том, что класс это шаблон для создания объекта в памяти. Прикинем грубый пример.

Предположим есть бумажная карта, на ней 100% спрятано 3 клада. И есть 3 прозрачные бумажки на которых нарисованы пути к кладам. На первой бумажке путь к кладу Х, на второй к кладу Y, на третьей вообще ничего нет, она ложится поверх двух предыдущих но ты всё равно видишь оба пути. Это типа мы описали наследование. Вот на карте по факту имеется 3 клада, а ты положил только первую бумажку, на которой есть путь к кладу Х, ты же знаешь, что по факту там больше кладов, но карта та типа А, и на ней только один путь к кладу Х. То есть у тебя переменная типа А указывает на объект типа С, но так как в переменной типа А нет описания второго пути, ты никак его и не увидишь, пока не будешь использовать бумажку типа B. Суть в том, что (CLR/среда разработки/не суть вообще ) видит лишь то, что описано в шаблоне, то есть в классе А.

Блин, я наверное не супер объясняю, сходу выдумал, но вроде должно быть понятно.
3
0 / 0 / 0
Регистрация: 08.02.2013
Сообщений: 111
13.12.2013, 18:05  [ТС] 8
Casper-SC

Так ссылки b,c,d ведут к полю x в классе а?
Я просто думал что они ведут к полям x в своих классах в которых тоже она описана
0
Эксперт .NET
4341 / 2003 / 387
Регистрация: 27.03.2010
Сообщений: 5,460
Записей в блоге: 1
13.12.2013, 18:19 9
Забыл сказать, что "карта" - это объект в памяти типа С. А каждый из шаблонов позволяет увидеть только то, что в них описано. Первый шаблон это класс А, 2 шаблона снизу класс А, сверху класс Б - это уже описание класса Б, 3 бумажки друг на друге вместе - это уже описание класса С.
1
59 / 58 / 16
Регистрация: 09.12.2013
Сообщений: 208
13.12.2013, 22:21 10
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
class A
{
    public int x;
}
 
class B:A
{
    public int y;
}
 
class C:A
{
 
}
 
class D:A
{
 
}
В классе A есть переменная x (родная)
В классе B (которая наследует А) есть переменная х (от А) и y (родная)
В классе С (которая наследует А) есть переменная х (от А)
В классе D (которая наследует А) есть переменная х (от А)

В чем вопрос?
1
0 / 0 / 0
Регистрация: 08.02.2013
Сообщений: 111
14.12.2013, 01:48  [ТС] 11
646kapeh064, Вопрос через ссылку b к какой переменной x мы доступаемся, класса A, или класса B?
0
438 / 362 / 100
Регистрация: 29.06.2010
Сообщений: 981
Записей в блоге: 1
14.12.2013, 10:33 12
Цитата Сообщение от ccobbra Посмотреть сообщение
Вопрос через ссылку b к какой переменной x мы доступаемся, класса A, или класса B?
В классе В нет своей переменной x, она наследована и она одна, т.е. условие ниже будет истино

C#
1
2
3
4
5
6
7
A a = new B();
            a.x = 10;
 
            if(((B) a).x != a.x)
            {
 
            }
Вот если изменить класс а следующим образом, тогда у класса А будет своя переменная х, а у класса В своя и мы можем присвоить значение обоим переменным.

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
class A
        {
            public int x;
        }
 
        class B : A
        {
            public int x;
            public int y;
        }
A a = new B();
            a.x = 10;
            ((B) a).x = 20;
            if (((B)a).x == a.x)
            {
 
            }
1
0 / 0 / 0
Регистрация: 08.02.2013
Сообщений: 111
14.12.2013, 12:10  [ТС] 13
Grishaco, у меня условие if(((B) a).x != a.x) дает ложь
0
438 / 362 / 100
Регистрация: 29.06.2010
Сообщений: 981
Записей в блоге: 1
14.12.2013, 12:18 14
Цитата Сообщение от ccobbra Посмотреть сообщение
у меня условие if(((B) a).x != a.x) дает ложь
Все правильно 10!=10 это ложь, для первого примера и if (((B)a).x == a.x) это тоже ложь, т.к. 10==20.
1
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
14.12.2013, 12:18

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

Приравнивание указателя одного типа к указателю другого
Есть структура : struct hci_inquiry_req { uint16_t dev_id; uint16_t flags; uint8_t lap;...

Перегрузка операции + с преобразованием объектов одного класса в объекты другого класса
Доброго времени суток! Изучаю ООП, при выполнении следующего задания возникли сложности: Создать...

Можно ли объявлять в описании одного класса объекты другого класса
Здравствуйте! Помогите, пожалуйста, разобраться: я описал класс SignalZakon, а теперь хочу создать...


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

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

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