Различные перегрузки метода Array.CreateInstance()
печатаются как возвращающие Array
, который действительно является абстрактным классом. Но тип объекта, который они возвращают, не является Array
напрямую, это некоторый тип, который наследует от Array
(какой тип точно зависит от используемой перегрузки и передаваемых параметров).
Например:
Array a = Array.CreateInstance(typeof(int), 10); //create some array
Type type = a.GetType(); // type is int[], which is not abstract
Type baseType = type.BaseType; // baseType is Array
По сути, это тот же принцип, что и следующий фабричный метод:
abstract class Animal
{
public static Animal CreateInstance(AnimalType animalType)
{
if (animalType == AnimalType.Cat)
return new Cat();
if (animalType == AnimalType.Dog)
return new Dog();
// etc.
}
}
Здесь Animal
- это абстрактный базовый тип, Cat
и Dog
- конкретные типы, которые наследуются от Animal
, а animalType
сообщает нам, какой тип должен возвращать метод.
Теперь массивы обрабатываются специальным образом в .Net (например, есть инструкции IL специально для работы с массивами). Но они не являются исключением в системе типов (за исключением, может быть, ковариации массивов).