C # --- Керівництво по C # --- коваріантного і контраваріантних в узагальненнях
У версії C # 4.0 можливості ковариантности і контраваріантних були розширені до параметрів узагальненого типу, що застосовуються в узагальнених інтерфейсів і делегатів. Коваріантність і контраваріантних застосовується, головним чином, для раціонального вирішення особливих ситуацій, що виникають у зв'язку із застосуванням узагальнених інтерфейсів і делегатів, визначених у середовищі .NET Framework. І тому деякі інтерфейси і делегати, певні в бібліотеці, були оновлені, щоб використовувати коваріантність і контраваріантних параметрів типу. Зрозуміло, перевагами ковариантности і контраваріантних можна також скористатися в інтерфейсах і делегатів, що створюються власними силами.
Застосування ковариантности в узагальненому інтерфейсі
Стосовно до узагальненого інтерфейсу коваріантність служить засобом, що дозволяє методом повертати тип, похідний від класу, наданого в секції типу. У минулому повертається тип повинен був в точності відповідати параметру типу в силу суворої перевірки узагальнень на відповідність типів. Коваріантність пом'якшує це суворе правило таким чином, щоб забезпечити типову безпеку. Параметр коваріантного типу оголошується за допомогою ключового слова out. яке передує ім'я цього параметра.
Для того щоб стали зрозумілішими наслідки застосування ковариантности, звернемося до конкретного прикладу. Нижче наведено дуже простий інтерфейс IMyInfo, в якому застосовується коваріантність:
Зверніть особливу увагу на те, як оголошується параметр узагальненого типу Т. Його імені передує ключове слово out. В даному контексті ключове слово out позначає, що узагальнений тип T є коваріантним. А раз він коваріантний, то метод GetObject () може повертати посилання на узагальнений тип T або ж посилання на будь-який клас, похідний від типу Т.
Застосування контраваріантних в узагальненому інтерфейсі
Стосовно до узагальненого інтерфейсу контраваріантних служить засобом, що дозволяє методом використовувати аргумент, тип якого відноситься до базового класу, зазначеному у відповідному параметрі типу. У минулому тип аргументу методу повинен був в точності відповідати параметру типу в силу суворої перевірки узагальнень на відповідність типів. Контраваріантних пом'якшує це суворе правило таким чином, щоб забезпечити типову безпеку. Параметр контраваріантного типу оголошується за допомогою ключового слова in. яке передує ім'я цього параметра.
Як бачите, узагальнений тип T вказується в даному інтерфейсі як контраваріантний за допомогою ключового слова in, що передує імені його параметра. Зверніть також увагу на те, що T є параметром типу для аргументу obj в методі Show ().
Контраваріантних виявляється придатною тільки для довідкових типів, а параметр контраваріантного типу можна застосовувати тільки до аргументів методів. Отже, ключове слово in можна вказувати в параметрі типу, який використовується як повертається типу.
Використання ковариантности і контраваріантних інтерфейсів ілюструє наступний приклад: