Урок 9: Обобщения и вариантность
Без обобщений каждая структура данных дублируется: AppleBasket, OrangeBasket — или ещё хуже, корзина из object с опасными приведениями типов во время выполнения. В этом уроке мы пишем один класс с параметром типа <T> и учимся, когда out и in позволяют корзине яблок стоять там, где ожидается корзина
Обобщения — это как одна форма для выпечки, наполняемая каждый раз другим тестом — форма никогда не меняется, только содержимое. А правило безопасности простое: доставать «фрукт» из ящика яблок безопасно, но бросать в него арбуз — нет.
- Обобщения и вариантность
- Параметры типа позволяют одному классу или интерфейсу безопасно обслуживать каждый тип; вариантность (out/in) решает, когда подтип может заменить базовый тип.
- параметр типа <T>
- Тип-заполнитель, который заполняет вызывающий код — Basket<Apple>, Basket<string> — обеспечиваемый компилятором на этапе компиляции, без приведений.
- ковариантность (out)
- Когда T появляется только как выход, IProducer<Apple> допустим как IProducer<Fruit> — всё, что выходит, является фруктом. Обратное направление, in, охватывает T только для входа.