Массивы указателей на базовый класс
Для создания массива указателей на базовый класс используется обобщенный список (List<T>). Рассмотрим пример с базовым классом Animal и производными классами Dog и Cat. Для работы с List<T> необходимо подключить пространство имен System.Collections.Generic.
using System.Collections.Generic;
// ... определения классов Animal, Dog, Cat ...
List<Animal> animals = new List<Animal>();
animals.Add(new Dog { Speed = 12.23f, Name = "Alex" });
animals.Add(new Dog { Speed = 15.5f, Name = "Bob" });
animals.Add(new Cat { Name = "Meow" });
Объекты, добавленные в animals, являются указателями на базовый класс Animal. Доступны только методы, определенные в Animal. Методы, специфичные для Dog или Cat, недоступны напрямую через переменную типа Animal.
Для перебора элементов массива используется цикл foreach:
foreach (Animal animal in animals)
{
Console.WriteLine(animal.Name);
if (animal is Dog dog)
{
Console.WriteLine(dog.Speed);
}
}
Доступ к свойству Speed возможен только после проверки типа объекта оператором is.
Оператор is
Оператор is проверяет, принадлежит ли объект к определенному типу или его подтипу. Он возвращает true, если объект совместим с указанным типом, и false в противном случае.
bool isDog = animal is Dog;
Console.WriteLine(isDog); // Выведет true или false в зависимости от типа animal
animal is Dog вернет true только если animal — объект класса Dog или его подкласса.
Оператор as
Оператор as пытается преобразовать объект к указанному типу. В отличие от is, он не вызывает исключение при неудачном преобразовании, а возвращает null.
Dog dog = animal as Dog;
if (dog != null)
{
Console.WriteLine(dog.Speed);
}
animal as Dog вернет объект типа Dog, если animal — объект класса Dog, и null в противном случае. Это позволяет избежать исключений при преобразовании типов.
Операторы is и as — мощные инструменты для работы с полиморфизмом и проверкой типов объектов в C#. is используется для проверки типа объекта, а as — для безопасного преобразования типов без риска исключений. List<T> позволяет создавать гибкие массивы, содержащие объекты различных типов, производных от общего базового класса.