AlphaRef.GetObject().GetName());
//А теперь создать объект MyClass
// *** Эта строка кода вполне допустима благодаря ковариантности. ***
AlphaRef = new MyClass
Console.WriteLine("Имя объекта, на который теперь ссылается " +
"переменная AlphaRef: " + AlphaRef.GetObject().GetName());
Прежде всего, переменной AlphaRef
типа IMyCoVarGenIF
в этом фрагменте кода присваивается ссылка на объект типа MyClass
. Это вполне допустимая операция, поскольку в классе MyClass
реализуется интерфейс IMyCoVarGenIF
, причем и в том, и в другом в качестве аргумента типа указывается Alpha
. Далее имя объекта выводится на экран при вызове метода GetName()
для объекта, возвращаемого методом GetObject()
. И эта операция вполне допустима, поскольку Alpha
— это и тип, возвращаемый методом GetName()
, и обобщенный тип Т. После этого переменной AlphaRef
присваивается ссылка на экземпляр объекта типа MyClassAlpha
, а обобщенный тип Т — ковариантным в интерфейсе IMyCoVarGenIF
. Если бы любое из этих условий не выполнялось, данная операция оказалась бы недопустимой.
Ради большей наглядности примера вся рассмотренная выше последовательность операций собрана ниже в единую программу.
// Продемонстрировать ковариантность в обобщенном интерфейсе,
using System;
// Этот обобщенный интерфейс поддерживает ковариантность.
public interface IMyCoVarGenIF
Т GetObject();
}
// Реализовать интерфейс IMyCoVarGenIF.
class MyClass
T obj;
public MyClass(T v) { obj = v; }
public T GetObject() { return obj; }
}
// Создать простую иерархию классов,
class Alpha {
string name;
public Alpha(string n) { name = n; }
public string GetName() { return name; }
// ...
}
class Beta : Alpha {
public Beta(string n) : base(n) { }
// ...
}
class VarianceDemo {
static void Main() {
// Создать ссылку из интерфейса IMyCoVarGenIF на объект типа MyClass
// Это вполне допустимо как при наличии ковариантности, так и без нее.
IMyCoVarGenIF
new MyClass
Console.WriteLine("Имя объекта, на который ссылается переменная " +
"AlphaRef: " + AlphaRef.GetObject().GetName());
//А теперь создать объект MyClass
// *** Эта строка кода вполне допустима благодаря ковариантности. ***
AlphaRef = new MyClass
Console.WriteLine("Имя объекта, на который теперь ссылается переменная "
+ "AlphaRef: " + AlphaRef.GetObject().GetName());
}
}
Результат выполнения этой программы выглядит следующим образом.
Имя объекта, на который ссылается переменная AlphaRef: Alpha #1
Имя объекта, на который теперь ссылается переменная AlphaRef: Beta #1