2015-12-25 3 views
12

Мы не можем создавать объекты абстрактного класса, но мы сможем создать список или массив из них . В чем разница?В чем разница между объектом абстрактного класса и списком объектов абстрактного класса?

+1

Список или массив - это просто место для набора указателей, и вы еще НЕ создали экземпляры чего-либо. Когда вы говорите «Создать объект», вы имеете в виду создание экземпляра, который вы не можете сделать с абстрактным классом. Но вы можете создавать списки или массивы, которые указывают на них (и являются ПУСТОЙ), - тогда вы можете переместить указатели на «реальные» экземпляры производных классов/объектов. – Grantly

+2

@Grantly, почему бы не сделать ответ;) – Console

+0

Жаль, что я был немного смущенный в то время :) Спасибо, я буду, но все остальные, я думаю, это покрыло - и я уверен, что он будет опущен вниз lol ... Вот он идет сейчас;) – Grantly

ответ

15

Список или массив - это просто место для набора указателей, и вы еще НЕ создали экземпляры чего-либо еще.

Когда вы говорите «Создать объект» - вы имеете в виду создать экземпляр - который вы не можете сделать с абстрактным классом.

Но вы можете создать списки или массивы, которые указывают на них (и пустуют) - то вы можете переместить указатели на «реальных» экземпляров производных классов/объектов

+2

", и вы еще ни разу не создали экземпляры." - кроме списка или массива; это сам экземпляр списка или массива. –

+0

@TJamesBoone вы абсолютно правы, но я не хотел путать или затруднять проблему. Мой ответ не очень всеобъемлющий - и не хватает деталей, которые другие предоставляют, - но я надеялся на ответ, чтобы соответствовать краткости вопроса. – Grantly

0

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

Просто означает любой производный тип абстрактного типа может быть в списке

+2

Я думаю, что пользователь имел в виду список, который объявлен как список с членами абстрактного класса. Это определенно возможно. –

+1

уверен, что это возможно, но он поставил «из них», и вы не можете вставить абстрактные экземпляры объекта. –

+0

Я понимаю вашу точку зрения. –

2

List пуст!

Это означает, что нет экземпляра класса abstract.

Создать пустой список. Вы можете (позже) добавить к нему класс non abstract, который расширяет его.

6

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

Логично, что список является только контейнером для указателей.

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

Вы также можете инициализировать список с начальным размером, но в начале он не будет содержать ссылки на фактические объекты: инициализация будет только предубирать пространство для указателей.

Объекты, добавленные в список, должны быть экземплярами конкретного класса, который расширяет абстрактный класс.

8

Резюме Ответ:

Список или сам массив не является абстрактным классом, даже если тип он заявляет, что будет держать это абстрактный класс.

более подробный ответ:

Даже если вы не можете создать объект абстрактного класса (слово «из» нескольких расплывчатых, но, очевидно, вы имеете в виду как прямая конкретизация этого класса), вы можете создать объект, который является экземпляром абстрактного класса (потому что это экземпляр конкретного класса, который расширяет указанный абстрактный класс).

В принципе, учитывая абстрактный класс 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); 
+1

Вероятно, вы имели в виду 'public class Concrete: Abstraction', Обратите внимание, что двоеточие,' extends' - это Java. – Kroltan

+1

К сожалению, вы правы. Прошло некоторое время с тех пор, как я был на C#, много лет занимаюсь Java. –

2

Я считаю, что U просто сильно печатая то, что объекты внутри массива будет

Так что, когда это приходит время, чтобы помещать объекты в массив. Он должен быть объект, который был продлен от абстрактного класса

3

Вы не можете создать экземпляр абстрактного класса для obvious reasons, но, конечно, создавая экземпляр класса List<T> допускается независимо, что T является абстрактным классом ,

Позвольте назвать абстрактный класс ClassAbstract.

  • Когда вы пытаются делать - new ClassAbstract(), вы попробовать создать объект ClassAbstract.
  • Когда вы это сделаете - new List<ClassAbstract>(), вы создаете объект класса List<T>.
2

Нет единорогов в розовой магии.

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

Более реалистичная аналогия: вы не можете пойти в зоомагазин и купить «млекопитающее». Это слишком абстрактно.

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

(Как построить конюшню, которая может одновременно разместить мышей и горбатых китов, как упражнение для читателя.)

+0

Когда я прочитал первую строку вашего ответа, я подумал, что я нажал на другой вопрос и читал ответы для этого. Затем я проверил, был ли у меня правильный вопрос. И тогда я понял вашу мысль. : D – displayName