Почему нельзя создать объект абстрактного класса? - PullRequest
18 голосов
/ 23 апреля 2010

Вот сценарий в моей голове, и я гуглил, много гнул, но получил ответ вроде

"Абстрактный класс не реализовал метод, поэтому мы не можем создать объект" «Слово« Аннотация »указывает компилятору не создавать объект класса»

Но в простом классе, где у нас есть все виртуальные методы, способные создать объект ???

Кроме того, мы можем определить другой доступ, модифицированный для конструктора класса Abstract, например, private, protected или public.

Мой поиск окончен на этот вопрос:

Почему мы не можем создать объект класса Abstract?

Ответы [ 16 ]

56 голосов
/ 23 апреля 2010

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

Класс abstract имеет конструктор protected (по умолчанию), позволяющий производным типам инициализировать его.

Например, базовый тип Stream является абстрактным. Без производного типа куда пойдут данные ? Что произойдет , когда вы вызовете метод abstract? Не было бы реальной реализации вызываемого метода.

21 голосов
/ 23 апреля 2010

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

Возьмем, к примеру, абстрактный класс "Животное". Нет такого понятия, как «чистое» животное - есть определенные типы животных. Таким образом, вы можете создать экземпляр Dog and Cat and Turtle, но вы не сможете создать экземпляр простого Animal - это всего лишь базовый шаблон. И есть определенные функциональные возможности, которыми обладают все животные, такие как "makeSound()",, но которые не могут быть определены на базовом уровне животных. Поэтому, если бы вы могли создать объект Animal и вы бы назвали makeSound(),, как бы объект узнал, какой звук сделать?

4 голосов
/ 23 апреля 2010

Он предназначен для использования в качестве базового класса.

http://msdn.microsoft.com/en-us/library/sf985hc5(VS.71).aspx

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

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

Абстрактные классы имеют следующие Особенности:

  • Абстрактный класс не может быть создан .
  • Абстрактный класс может содержать абстрактные методы и методы доступа.
  • Невозможно изменить абстрактный класс с модификатором sealed, что означает, что класс не может быть унаследован.
  • Неабстрактный класс, производный от абстрактного класса , должен включать фактические реализации всех унаследованных абстрактных методов и средств доступа .
3 голосов
/ 23 апреля 2010

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

abstract class A
{
    public abstract void D();
    public void E() { }
}

class B : A
{
    public override void D() { }
}

class C : A
{
    public override void D() { }
}

...

A a = new B();
a.D();
a.E();

List<A> list = new List<A>() { new B(), new C() };
2 голосов
/ 23 апреля 2010

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

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

2 голосов
/ 23 апреля 2010

Абстрактные классы должны иметь хотя бы один виртуальный метод или свойство, которое не имеет реализации. Это помечено абстрактным ключевым словом. Унаследованные классы должны обеспечивать реализацию, если они сами не абстрагируются. Вы не можете создать экземпляр абстрактного класса, потому что он не имеет полной реализации. Если это так, в первую очередь он не должен быть помечен как абстрактный.

1 голос
/ 15 мая 2014

Мы не можем создать объект для абстрактного класса bcoz, в основном абстрактный класс содержит «абстрактные методы», поэтому абстрактные методы являются неполными методами. Поэтому мы не можем оценить объем памяти этих методов, сколько они будут занимать. Это один из причина, по которой мы не можем создать объект для абстрактного класса.

1 голос
/ 20 мая 2012

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

0 голосов
/ 22 августа 2017

Ссылка Studytonight :

Когда мы создаем чистую виртуальную функцию в классе Abstract, мы резервируем слот для функции в VTABLE (изучено в последней теме), но не поместите любой адрес в этот слот. Следовательно, VTABLE будет неполным.

Поскольку класс VTABLE for Abstract неполон, следовательно, компилятор не позволит создать объект для такого класса и будет отображать Сообщение об ошибке всякий раз, когда вы пытаетесь это сделать.

0 голосов
/ 05 мая 2017

Когда мы создаем чистую виртуальную функцию в классе Abstract, мы резервируем слот для функции в VTABLE (изучался в последней теме), но не помещаем в этот слот какой-либо адрес. Следовательно, VTABLE будет неполным.

Поскольку класс VTABLE for Abstract является неполным, следовательно, компилятор не разрешит создание объекта для такого класса и будет отображать сообщение об ошибке всякий раз, когда вы пытаетесь это сделать.

Источник : Исследование сегодня вечером

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...