C # абстрактный класс, работает с инициализацией массива - PullRequest
2 голосов
/ 27 октября 2010

Поскольку мы знаем, что НЕ МОЖЕМ создать экземпляр abstract class.

Я просто хочу знать, что если мы создадим массив абстрактного класса, он обязательно будет работать.

Например

public abstract class Creator
{
    public abstract void DoSomething();
}

Creator creator = new Creator(); // this will give you compilation error!

Creator[] creator = new Creator[2]; // this will SURE work and will NOT give you compilation error.

Может кто-нибудь, пожалуйста, дайте мне знать, почему это происходит и почему он работает с инициализацией массива?

Заранее спасибо.

Ответы [ 4 ]

6 голосов
/ 27 октября 2010

Значения, хранящиеся в массиве во время инициализации, будут равны null, так что это фактически не создает никакого экземпляра абстрактного класса.Инициализация массива соответствует следующей (правильной) строке:

Creator creator = null;

Создание массивов типа AbstractClass[] на самом деле весьма полезно, поскольку вы можете хранить ссылки на некоторый конкретный (унаследованный) класс в массиве.Например:

var objects = new object[2];
objects[0] = "Hello";
objects[1] = new System.Random();

Затем вы можете, например, перебрать массив objects и вызвать ToString() для всех объектов.

3 голосов
/ 27 октября 2010

Здесь следует помнить, что вы не создаете экземпляры Creator, вы создаете массив тех типов, значения которых null.

1 голос
/ 27 октября 2010
Creator[] creator = new Creator[2];

просто инициализирует массив для хранения двух экземпляров класса Creator.Это на самом деле не создает экземпляров класса для вас.Оба эти элемента будут по-прежнему null, пока вы не инициализируете их.

0 голосов
/ 22 июля 2018

в массивах C # отличаются от базового типа.Creator и Creator[] - это два разных типа.Только Creator является абстрактным.Creator[] не является абстрактным, поэтому вы можете создавать его экземпляры.

...