Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.88/8: Рейтинг темы: голосов - 8, средняя оценка - 4.88
2 / 2 / 4
Регистрация: 02.03.2011
Сообщений: 134

Ковариантность обобщений - разобрать код

22.02.2015, 20:55. Показов 1614. Ответов 3
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Почему тут Figure становится типом Circle?
Должен же быть Shape, мы же апкастим его до Shape в строчке
IContainer<Shape> container = new Container<Shape>(circle);

Что-то не пойму...

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
37
38
39
using System;
 
// Ковариантность обобщений.
 
namespace Generics
{
    public abstract class Shape { }
    public class Circle : Shape { }
 
    public interface IContainer<T>
    {
        T Figure { get; set; }
    }
 
    public class Container<T> : IContainer<T>
    {
        public T Figure { get; set; }
 
        public Container(T figure)
        {
            this.Figure = figure;
        }
    }
 
    class Program
    {
        static void Main()
        {
            Circle circle = new Circle();
 
            IContainer<Shape> container = new Container<Shape>(circle);
 
            Console.WriteLine(container.Figure.ToString());
 
            // Delay.
            Console.ReadKey();
        }
    }
}
Добавлено через 6 минут
Вроде понял так. Свойство Figure содержит ссылку на переменную типа Сircle. При этом container.Figure.ToString() показывает, что Figure является типом Circle, а внутри container она воспринимается как Shape. Правильно или я совсем запутался?
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
22.02.2015, 20:55
Ответы с готовыми решениями:

Generic Типы и UpCast к базовому интерфейсному типу(ковариантность обобщений)
Всем привет, имеется следующий код: public abstract class Shape { } public class Circle : Shape { } public interface...

Разобрать код
Может кто–нибудь объяснить что здесь используеться class Privat_firm : Firm { string tovar_vupiskf; ...

Разобрать код
Прошу пояснить код программы, что где и почему. там по идеи должно быть: 1.В каждом классе спроектировать методы инициализации...

3
Эксперт .NETАвтор FAQ
 Аватар для Storm23
10427 / 5157 / 1825
Регистрация: 11.01.2015
Сообщений: 6,226
Записей в блоге: 34
22.02.2015, 21:02
Лучший ответ Сообщение было отмечено delexa как решение

Решение

Цитата Сообщение от delexa Посмотреть сообщение
Почему тут Figure становится типом Circle?
Должен же быть Shape, мы же апкастим его до Shape в строчке
Я думаю, вы плохо понимаете что такое кастинг.
Нужно запомнить одну простую вещь: если вы создаете объект типа T, то он внутри всегда так и останется типом T. Приведение же типов нужно лишь для того, что бы компилятор мог оперировать с этим объектом как с родительским типом. На физическом уровне кастинг ничего не меняет. Если вы пишите
C#
1
2
var boo = new Boo();
var foo = (Foo)boo;
это просто означает что компилятор может вызывать у foo методы класса Foo. Но сам объект как был типа Boo , так и останется типа Boo.

Добавлено через 6 минут
Ковариантность обобщений
Да, и кстати здесь у вас нет ковариантности интерфейса.
1
Жуткая тВарЬ
394 / 329 / 135
Регистрация: 06.02.2015
Сообщений: 962
Записей в блоге: 1
23.02.2015, 00:05
Я тоже не понял проблемы - если Вы создали контейнер Shapes то туда можно сунуть все что унаследовано по иерархии от Shape, а при вызове любого из элементов естественно тип будет Shape, но в реальности там будет объект наследник со всеми причитающимися ему методами свойствами и т.д. - его просто надо привести к соответствующему типу.
1
18 / 18 / 9
Регистрация: 23.02.2015
Сообщений: 86
23.02.2015, 13:08
Попробовал поизучать апкаст и даункаст, в результате еще больше запутался
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
37
38
39
40
41
42
43
44
45
46
47
48
49
using System;
 
// Ковариантность обобщений.
 
namespace Generics
{
    public class Base {
        public void BaseMethod() {
            Console.WriteLine("Base Method");
        }
    }
    public class Derived : Base {
        public void DerivedMethod() {
            Console.WriteLine("Derived Method");
        }
    }
 
    class Program
    {
        static void Main()
        {
            Base @base = new Base();
            Derived derived = new Derived();
            Base newBase = (Derived)@base;//DownCast to Base Type
            Derived newDerived = (Derived)derived;//UpCast to Derived Type
            newBase.BaseMethod();
            newDerived.BaseMethod();
            newDerived.DerivedMethod();
            Console.WriteLine(@base.GetType());
            Console.WriteLine(derived.GetType());
            Console.WriteLine(newBase.GetType());
            Console.WriteLine(newDerived.GetType());
 
            if (newBase is Base) Console.WriteLine("true");
            else Console.WriteLine("false");
 
            if (newBase is Derived) Console.WriteLine("true");
            else Console.WriteLine("false");
 
            if (newDerived is Base) Console.WriteLine("true");
            else Console.WriteLine("false");
 
            if (newDerived is Derived) Console.WriteLine("true");
            else Console.WriteLine("false");
            // Delay.
            Console.ReadKey();
        }
    }
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
23.02.2015, 13:08
Помогаю со студенческими работами здесь

Разобрать код
Нужно распарсить текст. Нашел какой-то пример, вроде все работает, только не могу разобраться в некоторых моментах. Вот описания...

Разобрать код
int del = 1; var s1 = zapros.Where(n =&gt; zapros.ElementAt(del) != n); var s2 =...

Разобрать код
Думал все просто тут, но выводит &quot;A&quot;... Почему? class Program { private Program(System.Object o) { ...

Попомгите разобрать код
Вобщем вот код Я так понимаю первое это форма авторизации в приложении. Потом идет шифрование, относительно процессора компа. ...

Разобрать код с foreach
static void Main() { int res1 = new int; foreach(int element in res1) ...


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

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Новые блоги и статьи
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip Сканируйте QR-код на мобильном и вы увидите, что появится джойстик для управления главным героем. . . .
Реалии
Hrethgir 01.03.2026
Нет, я не закончил до сих пор симулятор. Эта задача сложнее. Не получилось уйти в плавсостав, но оно и к лучшему, возможно. Точнее получалось - но сварщиком в палубную команду, а это значит, в моём. . .
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
SDL3 для Web (WebAssembly): Сборка библиотек: SDL3, Box2D, FreeType, SDL3_ttf, SDL3_mixer и SDL3_image из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual Studio. . . .
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru