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

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

12.07.2012, 10:57. Просмотров 1220. Ответов 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"? Я понимаю что ссылка на базовый класс видит только то, что определено в базовом классе, но ведь сигнатура методов одна. Объясните пожалуйста. http://www.cyberforum.ru/csharp-net/thread390767.html
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
12.07.2012, 10:57
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Не понимание полиморфизма и статического поля на примере представленного кода (C#):

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

Рефлексия, получить содержание поля статического класса
static class Messange { public static readonly string mes...

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

Как получить значения статического поля класса с помощью рефлексии?
Есть библиотека классов в ней некоторый класс А. у этого класса есть...

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

3
kolorotur
Эксперт .NET
9917 / 8302 / 2037
Регистрация: 17.09.2011
Сообщений: 14,286
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 / 68
Регистрация: 19.09.2011
Сообщений: 826
12.07.2012, 11:12 #3
По поводу первого:
Class<object> и Class<int> и Class<MyClass> - 3 разных класса.
По поводу второго:
В c# работает механизм раннего связывания.
0
vehf
1 / 1 / 1
Регистрация: 24.11.2012
Сообщений: 32
23.09.2013, 18:01 #4
Поясните понятия статического и динамического полиморфизма?
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
23.09.2013, 18:01
Привет! Вот еще темы с решениями:

Правильное понимание и обоснование использования полиморфизма
Всем привет! Помогите понять полиморфизм правильно. Так как примеров в...

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

В какой из перечисленных строк представленного кода допущены ошибки?
В какой из перечисленных строк представленного кода допущены ошибки? ...

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


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

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

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