Форум программистов, компьютерный форум, киберфорум
Наши страницы

C# для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 9, средняя оценка - 4.78
goodwen053
6 / 6 / 1
Регистрация: 29.05.2011
Сообщений: 45
#1

Не понимание полиморфизма и статического поля на примере представленного кода - C#

12.07.2012, 10:57. Просмотров 1203. Ответов 3
Метки нет (Все метки)

Здравствуйте, Объясните мне пожалуйста по следующему коду:

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
using System;
 
class Base 
{
}
class Derived : Base 
{
}
class Generic<T>
{
    public static int id;
}
class Program
{
    static void Main()
    {
        Generic<Derived>.id = 1;
        Generic<Base>.id = 2;
        Console.WriteLine(Generic<object>.id);
        Console.WriteLine(Generic<Base>.id);
        Console.WriteLine(Generic<Derived>.id);
        Console.ReadKey();
    }
}
Вопрос касается вот этого участка кода:
C#
1
2
3
4
5
6
        
        Generic<Derived>.id = 1;
        Generic<Base>.id = 2;
        Console.WriteLine(Generic<object>.id);
        Console.WriteLine(Generic<Base>.id);
        Console.WriteLine(Generic<Derived>.id);
По какой причине по первой ссылке всё таки в консоль будет выведено 1, а по второй 2, если поле статическое (оно ведь одно на весь класс и должно вывестись в обоих строчках значение 2)?

Так же вопрос по следующему коду:
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 Base
    {
        public string M() 
        {
            return "Base";
        }
    }
    class Derived : Base
    {
        public new string M() 
        {
            return "Derived";
        }
    }
 
    class Program
    {
        static void Main(string[] args)
        {
            Base obj = new Derived();
            Console.WriteLine(obj.M());
            Console.ReadKey();
        }
    }
Здесь идёт сокрытие имён в классе Derived. На консоль будет выведено "Base", но я не понимаю почему, да ссылка идёт на базовый класс, но ведь ссылка на объект производного класса и там реализация возвращения строки "Derived"? Я понимаю что ссылка на базовый класс видит только то, что определено в базовом классе, но ведь сигнатура методов одна. Объясните пожалуйста.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
12.07.2012, 10:57
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Не понимание полиморфизма и статического поля на примере представленного кода (C#):

Понимание чужого кода - C#
Скажите, пожалуйста, есть какие либо правила, способы, подсказки как лучше всего разобраться в чужом (достаточно большом) коде? Про дебагер...

Система шифрования Вижинера: есть понимание сути, нет понимания кода - C#
В системе шифрования Вижинера я вроде как разобралась, но как показала практика, правильно получается только на листе бумаги.Вот что у...

Рефлексия, получить содержание поля статического класса - C#
static class Messange { public static readonly string mes = &quot;Привет&quot;; } необходимо только по имени...

Как получить значения статического поля класса с помощью рефлексии? - C#
Есть библиотека классов в ней некоторый класс А. у этого класса есть статическое поле - его ID. Class A{ static int ID; } в главное...

Как задать значения статического поля класса используя рефлексию? - C#
Народ как задать значение статическому полю класса при помощи рефлексии. Есть тема...

Не хватает кода в примере из книги - C#
Решил начать изучать C#.вообщем дошел до кода в учебнике,а тут скрин кривой и нет всего кода,подскажите как дальше?Другие учебники брал,как...

3
kolorotur
Эксперт .NET
9207 / 7720 / 1236
Регистрация: 17.09.2011
Сообщений: 13,295
12.07.2012, 11:07 #2
Цитата Сообщение от goodwen053 Посмотреть сообщение
По какой причине по первой ссылке всё таки в консоль будет выведено 1, а по второй 2, если поле статическое
Во время компиляции для каждого используемого типа генерируется отдельный класс, то есть на выходе у вас будет иметься три класса:
C#
1
2
3
class Generic_Base { public static int id;}
class Generic_Derived { public static int id;}
class Generic_Object { public static int id;}
Три класса, три разных статических переменных, три разных значения.

Цитата Сообщение от goodwen053 Посмотреть сообщение
я не понимаю почему
Объяснение в названии: метод скрывается, а не переопределяется.
В этом весь смысл сокрытия: скрывающий метод вызывается только тогда, когда используется ссылка на тип, скрывающий этот метод.
При использовании ссылки на родительский класс, будет вызван родительский метод.

Цитата Сообщение от goodwen053 Посмотреть сообщение
да ссылка идёт на базовый класс, но ведь ссылка на объект производного класса и там реализация возвращения строки "Derived"?
Такой функционал достигается использованием virtual(abstract)/override.
0
y-fox
518 / 510 / 18
Регистрация: 19.09.2011
Сообщений: 826
12.07.2012, 11:12 #3
По поводу первого:
Class<object> и Class<int> и Class<MyClass> - 3 разных класса.
По поводу второго:
В c# работает механизм раннего связывания.
0
vehf
1 / 1 / 0
Регистрация: 24.11.2012
Сообщений: 32
23.09.2013, 18:01 #4
Поясните понятия статического и динамического полиморфизма?
0
23.09.2013, 18:01
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
23.09.2013, 18:01
Привет! Вот еще темы с ответами:

Правильное понимание и обоснование использования полиморфизма - PHP ООП
Всем привет! Помогите понять полиморфизм правильно. Так как примеров в Интернете много и все они отличаются друг от друга. Как я...

продемонстрировать механизм полиморфизма на примере составления списка студентов группы и преподавателей колледжа. - Delphi
Средствами объектно-ориентированного программирования языка Delphi продемонстрировать механизм полиморфизма на примере составления списка...

В какой из перечисленных строк представленного кода допущены ошибки? - HTML, CSS
В какой из перечисленных строк представленного кода допущены ошибки? &lt;!DOCTYPE html&gt; &lt;html&gt; &lt;head&gt; &lt;meta charset=&quot;utf-8&quot;&gt; ...

Понимание кода - JavaScript
Имеется такой код this.calculate = function ( hours, mins, day ) { var inputDate = new...


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

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

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