Как можно создать объект из абстрактного класса? - PullRequest
3 голосов
/ 14 января 2012

Мы знаем, что класс Array в c # является абстрактным.

Но статический метод CreateInstance этого класса возвращает объект класса Array.

Как это возможно?

Ответы [ 5 ]

5 голосов
/ 14 января 2012

Описание

Нет, вы не можете создать экземпляр абстрактного класса.

MSDN : Абстрактные классы тесно связаны с интерфейсами. Это классы, которые не могут быть созданы и часто либо частично реализованы, либо не реализованы вовсе. Одно ключевое отличие между абстрактными классами и интерфейсами состоит в том, что класс может реализовывать неограниченное количество интерфейсов, но может наследовать только от одного абстрактного (или любого другого вида) класса. Класс, производный от абстрактного класса, все еще может реализовывать интерфейсы. Абстрактные классы полезны при создании компонентов, поскольку они позволяют указывать инвариантный уровень функциональности в некоторых методах, но оставляют реализацию других методов до тех пор, пока не потребуется конкретная реализация этого класса. Они также хорошо работают, потому что если в производных классах требуются дополнительные функции, их можно добавить в базовый класс, не нарушая код.

Дополнительная информация

4 голосов
/ 14 января 2012

Это статический фабричный метод, который возвращает экземпляр массива.В этом примере создается массив длиной 10 для целочисленных типов значений.

System.Array myIntArray = Array.CreateInstance(typeof(int),10);

Это должно дать вам более подробную информацию http://msdn.microsoft.com/en-us/library/zb3cfh7k.aspx

1 голос
/ 14 января 2012

Различные перегрузки метода 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 специально для работы с массивами). Но они не являются исключением в системе типов (за исключением, может быть, ковариации массивов).

1 голос
/ 14 января 2012

Array представляется частным случаем абстрактного класса.Из того, что я прочитал в Документация , я бы предположил, что Array создание и функции каким-то образом обрабатываются внутри кода .NET Framework - скорее всего, широко используются нативный код для улучшения результатов производительности.Я думаю, именно поэтому этот класс был сделан абстрактным.

Я был бы рад, если бы кто-то, кто более разбирается во внутренних элементах .NET Framework, мог улучшить мой ответ.

0 голосов
/ 14 января 2012

Я думаю, что лучший способ обратиться к этой ситуации - рассмотреть метод, который возвращает вам экземпляр интерфейса !!!

Ну, вы знаете, что мы можем не создать экземпляринтерфейса, но внутри метод может знать о классе, реализующем этот интерфейс, и возвращать экземпляр этого класса.

...