Мы не можем создавать объекты абстрактного класса, но может создавать список или массив из них. В чем разница?
В чем разница между объектом абстрактного класса и списком объектов абстрактного класса?
Ответ 1
Список или массив - это просто место для набора указателей, и вы еще НЕ создали экземпляры чего-либо.
Когда вы говорите "Создать объект", вы имеете в виду создать экземпляр, который вы не можете сделать с абстрактным классом.
Но вы можете создавать списки или массивы, которые указывают на них (и являются ПУСТОЙ), - тогда вы можете переместить указатели на "реальные" экземпляры производных классов/объектов
Ответ 2
Резюме ответа:
Список или сам массив не является абстрактным классом, даже если тип, который он объявляет, будет содержать абстрактный класс.
Подробный ответ:
Даже если вы не можете создать объект абстрактного класса (слово "of" несколько неопределенно, но, очевидно, вы подразумеваете как непосредственное создание этого класса), вы можете создать объект, который является экземпляром абстрактного класса (потому что это экземпляр конкретного класса, который расширяет указанный абстрактный класс).
В принципе, данный абстрактный класс Abstraction
и конкретный класс Concrete
, который расширяет Abstraction
, List<Abstraction>
означает, что вы можете, но что-нибудь в нем, которое является экземпляром чего-то, что расширяет Abstraction
, например. экземпляр Concrete
. Хотя массивы немного отличаются от списков, то же самое и для них.
Пример:
Учитывая этот класс:
public abstract class Abstraction {
}
И этот класс:
public class Concrete : Abstraction {
}
Вы не можете этого сделать:
Abstraction a = new Abstraction();
Но вы можете это сделать:
Abstraction a = new Concrete();
И тогда вы можете это сделать:
IList<Abstraction> list = new List();
list.add(a);
Ответ 3
Можно объявить и инициализировать список, в котором тип членов является абстрактным классом, потому что для создания этого объекта вам не нужно фактически создавать экземпляр абстрактного класса.
Логически, список - это только контейнер для указателей.
Например, вы можете определить список абстрактного класса, но этот список может быть в начале пустым.
Вы также можете инициализировать список с начальным размером, но в начале он не будет содержать ссылки на фактические объекты: инициализация будет только предубирать пространство для указателей.
Объекты, добавленные в список, должны быть экземплярами конкретного класса, который расширяет абстрактный класс.
Ответ 4
Вы не можете создать экземпляр абстрактного класса для очевидных причин, но, безусловно, создание экземпляра класса List<T>
допускается независимо от того, что T является абстрактным класс.
Пусть абстрактный класс называется ClassAbstract
.
- Когда вы пытаетесь сделать -
new ClassAbstract()
, вы пытаетесь создать объектClassAbstract
. - Когда вы сделаете -
new List<ClassAbstract>()
, вы создаете объект классаList<T>
.
Ответ 5
List
пуст!
Это означает отсутствие экземпляра класса abstract
.
Создать пустой список. Вы можете (позже) добавить к нему класс non abstract
, который расширяет его.
Ответ 6
Я полагаю, что вы просто сильно набираете, какие объекты внутри массива будут
Итак, когда приходит время, чтобы помещать объекты в массив. Он должен быть объектом, который был расширен из абстрактного класса
Ответ 7
Нет единорогов розовой магии.
Но вы все равно можете создать конюшню для розовых магии единорогов, вы просто не сможете ее там помещать, потому что их нет.
Более реалистичная аналогия: вы не можете пойти в зоомагазин и купить "млекопитающее". Это слишком абстрактная вещь.
Но вы можете построить конюшню для млекопитающих. И тогда вы можете купить лошадей, коров, собак, кошек, слонов, жирафов, волков, леопардов и львов и положить их туда. Возможно, даже розовые магии единорогов, если вы можете найти их.
(Как построить конюшню, которая в то же время может разместить мышей и горбатых китов, остается в качестве упражнения для читателя.)
Ответ 8
Нет, вы не можете создать массив из них, потому что вы не можете поместить абстрактные типы в список. Список абстрактного типа содержит любые производные экземпляры абстрактного типа.
Просто означает, что любой производный тип абстрактного типа может быть в списке