Прежде всего, переменной-AlphaRef типа IMyCoVarGenIF в этом фрагменте кода присваивается ссылка на объект типа MyClass. Это вполне допустимая операция, поскольку в классе MyClass реализуется интерфейс IMyCoVarGenlF, причем и в том, и в другом в качестве аргумента типа указывается Alpha. Далее имя объекта выводится на экран при вызове метода GetName () для объекта, возвращаемого методом GetOb j ect (). И эта операция вполне допустима, поскольку Alpha — это и тип, возвращаемый методом GetName (), и обобщенный тип Т. После этого переменной AlphaRef присваивается ссылка на экземпляр объекта типа MyClass, что также допустимо, потому что класс Beta является производным от класса Alpha, а обобщенный тип Т — ковариантным в интерфейсе IMyCoVarGenlF. Если бы любое из этих условий не выполнялось, данная операция оказалась бы недопустимой.

Ради большей наглядности примера вся рассмотренная выше последовательность операций собрана ниже в единую программу.

// Продемонстрировать ковариантность в обобщенном интерфейсе, using System;

// Этот обобщенный интерфейс поддерживает ковариантность. public interface IMyCoVarGenIF {

Т GetObjectO;

}

// Реализовать интерфейс IMyCoVarGenlF. class MyClass : IMyCoVarGenIF {

T obj;

public MyClass(T v) { obj = v; } public T GetObjectO { return obj; }

}

// Создать простую иерархию классов, class Alpha { string name;

public string GetNameO { return name; }

// ...

}

class Beta : Alpha {

public Beta(string n) : base(n) { }

// ...

}

class VarianceDemo { static void Main() {

// Создать ссылку из интерфейса IMyCoVarGenlF на объект типа MyClass.

// Это вполне допустимо как при наличии ковариантности, так и без нее. IMyCoVarGenIF AlphaRef = new MyClass(new Alpha("Alpha #1"));

Console.WriteLine("Имя объекта, на который ссылается переменная " +

"AlphaRef: " + AlphaRef.GetObj ect().GetName());

//А теперь создать объект MyClass и присвоить его // переменной AlphaRef.

// *** Эта строка кода вполне допустима благодаря ковариантности. *** AlphaRef = new MyClass(new Beta("Beta #1"));

Console.WriteLine("Имя объекта, на который теперь ссылается переменная " + "AlphaRef: " + AlphaRef.GetObj ect() .GetName());

}

}

Результат выполнения этой программы выглядит следующим образом.

Имя объекта, на который ссылается переменная AlphaRef: Alpha #1 Имя объекта, на который теперь ссылается переменная AlphaRef: Beta #1

Перейти на страницу:

Похожие книги