Результат выполнения этой программы выглядит следующим образом.
Имя объекта, на который ссылается переменная AlphaRef: Alpha #1 Имя объекта, на который теперь ссылается переменная AlphaRef: Beta #1
Следует особо подчеркнуть, что переменнойAlphaRefможно присвоить ссылку на объект типаMyClass
Один обобщенный интерфейс может вполне наследовать от другого. Иными словами, обобщенный интерфейс с параметром ковариантного типа можно расширить, как показано ниже.
public interface IMyCoVarGenIF2
// ...
}
Обратите внимание на то, что ключевое словоoutуказано только в объявлении расширенного интерфейса. Указывать его в объявлении базового интерфейса не только не нужно, но и не допустимо. И последнее замечание: обобщенный типТдопускается не указывать как ковариантный в объявлении интерфейсаIMyCoVarGenIF2.Но при этом исключается ковариантность, которую может обеспечить расширенный интерфейс
IMyCoVarGetlF.Разумеется, возможность сделать интерфейсIMyCoVarGenIF2инвариантным может потребоваться в некоторых случаях его применения.
На применение ковариантности накладываются некоторые ограничения. Ковариантность параметра типа может распространяться только на тип, возвращаемый методом. Следовательно, ключевое словоoutнельзя применять в параметре типа, служащем для объявления параметра метода. Ковариантность оказывается пригодной только для ссылочных типов. Ковариантный тип нельзя использовать в качестве ограничения в интерфейсном методе. Так, следующий интерфейс считается недопустимым.
public interface IMyCoVarGenIF2
void M
// использовать как ограничение
}
Применение контравариантности в обобщенном интерфейсе