Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > .NET Frameworks (точка нет фреймворки) > C# (си шарп)
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 08.07.2016, 16:31   #1
BadCats
Пользователь
 
Аватар для BadCats
 
Регистрация: 31.01.2016
Сообщений: 67
Радость Generic Типы и двойной UpCast

всем привет, имеется следующий пример:
Код:
 public abstract class Shape { }
    public class Circle : Shape { }

    public interface IContainer<out T>
    {
        T Figure { get; }
    }

    public class Container<T> : IContainer<T>
    {
        private T figure;

        public Container(T figure)
        {
            this.figure = figure;
        }

        public T Figure
        {
            get { return figure; }
        }
    }

    class Program
    {
        static void Main()
        {
            Circle circle = new Circle();

            IContainer<Shape> container = new Container<Circle>(circle);

            Console.WriteLine(container.Figure.ToString());

            // Delay.
            Console.ReadKey();
        }
    }
меня интересует вот эта строка
Код:
IContainer<Shape> container = new Container<Circle>(circle);
-экземпляр circle (передаваемый в качестве аргумента конструктора) ни приводится ни к какому типу в данном случае - т.к тип Т (я знаю, что правильно говорить тип места заполнения типом Т, но просто "тип Т" - будет короче) у класса Container мы закрыли тем же типом, что и данный экземпляр (и я имею ввиду, что т.к типы у них одинаковые, то и приводится не к чему.)

Итак, у нас сперва тип Container приводим к типу IContainer, а поле figure типа Circle приводится к типу Shape.

Почему поле figure внутри класса Container приводится к типу Shape?

итак мои предположения:

1) передаваемый в качестве аргумента экземпляр тут ни причем - т.к как уже было сказанно выше сам экземпляр никчему не приводится.

2)Из-за того, что тип Container мы привели к типу IContainer - тип Т у которого мы закрыли типом Shape

- и отсюда возникает еще один вопрос: у нас одновременно происходит как бы два UpCast -а : Container - IContainer;

Circle-Shape; - какой из них так скажем влияем на передаваемый аргумент конструктора - наш экземпляр circle (да-да, я знаю, что выше писал, что UpCast -a экземпляра circle не происходит - просто в предыдущем примере экземпляр приводится к типу Shape )
Код:
IContainer<Shape> container = new Container<Shape>(circle);
- но, раз поле figure меняет тип, а ссылка на это поле хранится в этом экземпляре, который мы передаем в качестве аргумента конструктора.

Моя догадка заключается в том, что раз мы тип Т у Container (Circle) - тот тип которого и аргумент конструктора circle - приводим к типу Т у IContainer(Shape), то и этот аргумент конструктора типа Circle также неявно UpCast - ится "следуя" изменениям своего типа - и соответственно затем произойдет UpCast типов внутри этого экземпляра в том числе и поля figure - которое изменит свой тип Circle на Shape.
BadCats вне форума Ответить с цитированием
Старый 08.07.2016, 20:29   #2
come-on
Участник клуба
 
Регистрация: 21.10.2015
Сообщений: 1,361
По умолчанию

тут просто наследование работает, и всё а дженерик или нет дело десятое
come-on вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Generic Типы и UpCast к базовому интерфейсному типу(ковариантность обобщений) BadCats C# (си шарп) 2 21.06.2016 23:28
Generic C# Sparky Помощь студентам 12 12.10.2012 20:32