Позволяя нам преобразовывать дочерние классы как более производный класс или базовый класс, мы можем создавать коллекции базового класса, которые могут содержать элементы, которые являются более производными.Посмотрите ниже на это в действии, используя классы Cat
и Dog
, которые оба наследуют от базового класса Animal
:
Cat c = new Cat();
Dog d = new Dog();
List<Animal> myPets = new List<Animal>();
myPets.Add(c);
myPets.Add(d); //no casting needed
Так что у базы Animal
есть свойство, которое содержитage:
public int Age { get; set; }
Поскольку мы неявно сказали, что my Cat
c и Dog
d относятся к типу Animal
, мы можем вызывать этот тип без выполнения приведения, что полезно.
Foreach(Animal a in myPets)
Console.WriteLine(a.Age);
Это полезно для, возможно, коллекций элементов управления, где у нас есть asp:Panel
в Asp.Net или Panel
в winforms, которые содержат дочерние элементы (которые могут быть коллекцией label
, textbox
и т. д.) вместо того, чтобы содержать List
каждого из этих элементов, мы можем преобразовать их в базу, которую они все разделяют, которая является классом Control
, позволяющим нам иметь коллекцию дочерних элементов или узлов, хранящихся в виде коллекцииControls
и когда мы хотим выполнить какую-либо операцию, мы можем уменьшить ее до более производного типа (используя as
/ is
)
Это также полезно для делегатов, когда при создании делегата мы можем назначитьболее производный тип, чем онвозврат может быть использован для нескольких различных типов.Это то же самое для коллекций универсального типа.Вы должны прочитать больше по ссылке, потому что она имеет отличные примеры.
Это ковариация и контравариантность
В C # ковариация и контравариантность включают неявное преобразование ссылок для типов массивов, типов делегатов и аргументов универсального типа. Ковариация сохраняет совместимость присваивания, а противоположность обращает ее.
Дополнительная литература