Может ли быть конструктор у абстрактного класса для чего
Может ли абстрактный класс иметь конструктор?
Может ли абстрактный класс иметь конструктор?
Если да, то как это можно использовать и для каких целей?
ОТВЕТЫ
Ответ 1
Да, абстрактный класс может иметь конструктор. Рассмотрим это:
Суперкласс Product является абстрактным и имеет конструктор. Конкретный класс TimesTwo имеет конструктор, который просто кодирует значение 2. Конкретный класс TimesWhat имеет конструктор, который позволяет вызывающему указать значение.
Абстрактные конструкторы часто используются для принудительного применения ограничений класса или инвариантов, таких как минимальные поля, необходимые для настройки класса.
ПРИМЕЧАНИЕ. Поскольку в родительском конструкторе нет конструктора по умолчанию (или no-arg) абстрактный класс, конструктор, используемый в подклассе, должен явно вызвать родительский конструктор.
Ответ 2
Вы определяете конструктор в абстрактном классе, если вы находитесь в одной из следующих ситуаций:
Обратите внимание, что:
В любом случае не забывайте, что если вы не определяете конструктор, то компилятор автоматически сгенерирует его для вас (этот является общедоступным, не имеет аргументов и ничего не делает).
Ответ 3
Да, он может иметь конструктор, и он определяется и ведет себя точно так же, как и любой другой конструктор класса. За исключением того, что абстрактные классы не могут быть непосредственно созданы, расширены, поэтому использование поэтому всегда происходит из конструктора подкласса.
Ответ 4
Да, когда мы определяем класс как абстрактный класс, он не может быть создан, но это не означает, что абстрактный класс не может иметь конструктор. Каждый абстрактный класс должен иметь конкретный подкласс, который будет реализовывать абстрактные методы этого абстрактного класса.
Когда мы создаем объект любого подкласса, все конструкторы в соответствующем дереве наследования вызываются в подходе сверху вниз. То же самое относится и к абстрактным классам. Хотя мы не можем создать объект абстрактного класса, когда мы создаем конкретный объект класса и подкласс абстрактного класса, конструктор абстрактного класса вызывается автоматически. Следовательно, мы можем иметь конструктор в абстрактных классах.
Примечание: у неабстрактного класса не может быть абстрактных методов, но у абстрактного класса может быть неабстрактный метод. Причина аналогична конструкторам, с той разницей, что вместо автоматического вызова мы можем вызвать super(). Кроме того, нет ничего лучше абстрактного конструктора, поскольку он не имеет никакого смысла.
Ответ 5
Он не только может, он всегда это делает. Если вы не укажете один, то у него есть конструктор arg по умолчанию, как и любой другой класс. Фактически, ВСЕ классы, включая вложенные и анонимные классы, получат конструктор по умолчанию, если он не указан (в случае анонимных классов его невозможно указать, поэтому вы всегда получите конструктор по умолчанию).
Хорошим примером абстрактного класса, имеющего конструктор, является класс Calendar. Вы получаете объект Calendar, вызывая Calendar.getInstance(), но он также имеет конструкторы, которые защищены. Причина, по которой его конструкторы защищены, заключается в том, что только их подклассы могут вызывать их (или классы в одном пакете, но поскольку они абстрактны, что не применяется). GregorianCalendar является примером класса, расширяющего календарь.
Ответ 6
Да, может, конструкторы абстрактных классов обычно используются для супервызов для событий инициализации, общих для всех подклассов
Ответ 7
У абстрактного класса может быть конструктор, НО вы не можете создать объект абстрактного класса, так как вы используете этот конструктор?
Дело в том, что когда вы наследуете этот абстрактный класс в своем подклассе, вы можете передавать значения в его (абстрактный) конструктор через метод super (значение) в своем подклассе, и нет, вы не наследуете конструктор.
поэтому с помощью super вы можете передавать значения в конструктор абстрактного класса, и, насколько я помню, это должен быть первый оператор в вашем методе или конструкторе.
Ответ 8
Хотя есть много хороших ответов, я хотел бы дать свои 2 цента.
Конструктор НЕ СОЗДАЕТ ОБЪЕКТ. Он используется для инициализации объекта.
Абстрактный класс (в отличие от интерфейса) может иметь неконечные нестатические поля, которые требуют инициализации. Вы можете написать свой собственный конструктор в абстрактном классе, чтобы сделать это. Но в этом случае не будет никакого конструктора по умолчанию.
Будьте осторожны при расширении выше абстрактного класса, вы должны явно вызывать super из каждого конструктора. Первая строка любого конструктора вызывает super(). если вы явно не вызовете super(), Java сделает это за вас. Ниже код не будет компилироваться:
Вы должны использовать его, как показано ниже:
Ответ 9
Конечно, у абстрактного класса может быть конструктор. Обычно для инициализации полей используется конструктор класса. Итак, конструктор абстрактного класса используется для инициализации полей абстрактного класса. Вы бы предоставили конструктор для абстрактного класса, если хотите инициализировать определенные поля абстрактного класса до того, как будет создан экземпляр дочернего класса. Абстрактный конструктор класса также можно использовать для выполнения кода, который важен для каждого дочернего класса. Это предотвращает дублирование кода.
Мы не можем создать экземпляр абстрактного класса, но мы можем создать экземпляры классов, которые являются производными от абстрактного класса. Таким образом, когда создается экземпляр производного класса, автоматически вызывается родительский конструктор абстрактного класса.
Ответ 10
Суперкласс является абстрактным и имеет конструктор.
Ответ 11
Как описано javafuns здесь, это пример:
Ответ 12
В конкретном классе объявление конструктора для конкретного типа Fnord эффективно раскрывает две вещи:
Средство, с помощью которого код может запрашивать создание экземпляра Fnord
Средство, с помощью которого экземпляр типа, производного от Fnord, который находится в стадии разработки, может запросить инициализацию всех функций базового класса.
В то время как, возможно, существуют средства, с помощью которых эти две способности могут контролироваться раздельно, для каждого конкретного типа одно определение позволит обоим. Хотя первая способность не имеет смысла для абстрактного класса, вторая способность столь же значима для абстрактного класса, как и для любого другого, и поэтому его объявление так же необходимо и полезно.
Ответ 13
Да, абстрактные классы могут иметь конструкторы!
Вот пример использования конструктора в абстрактном классе:
Итак, я думаю, вы получили ответ.
Ответ 14
да, это так. И конструктор абстрактного класса вызывается, когда создается экземпляр унаследованного класса. Например, следующая действительная Java-программа.
Это результат приведенного выше кода,
Вызывается базовый конструктор Выведенный конструктор
Ответ 15
Абстрактный класс может иметь конструктор, хотя он не может быть создан. Но конструктор, определенный в абстрактном классе, может быть использован для создания конкретного класса этого абстрактного класса. Проверьте JLS:
Это ошибка времени компиляции, если предпринимается попытка создать экземпляр абстрактного класса с использованием создания экземпляра класса Выражение.
Подкласс абстрактного класса, который не является абстрактным, может быть созданный в результате выполнения конструктора для абстрактный класс и, следовательно, выполнение инициализаторов полей например переменные этого класса.
Ответ 16
Для достижения цепочки конструктора абстрактный класс будет иметь конструктор. Компилятор хранит оператор Super() внутри конструктора подкласса, который вызовет конструктор суперкласса. Если для абстрактных классов не было конструкторов, то правила java нарушаются, и мы не можем добиться цепочки конструкторов.
Ответ 17
Да, абстрактный класс может иметь конструктор. Вы можете перегружать столько конструкторов, сколько хотите в абстрактном классе. Эти подрядчики могут использоваться для инициализации начального состояния объектов, расширяющих абстрактный класс. Как мы знаем, мы не можем создать объект абстрактного класса, потому что объекты создаются «новыми» ключевыми словами, а не конструкторами. они существуют только для инициализации состояния объектов подкласса.
Ответ 18
Поскольку абстрактный класс может иметь переменные всех модификаторов доступа, они должны быть инициализированы значениями по умолчанию, поэтому необходим конструктор. Когда вы создаете экземпляр дочернего класса, вызывается конструктор абстрактного класса и инициализируются переменные.
Напротив, интерфейс содержит только постоянные переменные, то есть они уже инициализированы. Поэтому интерфейсу не нужен конструктор.
Ответ 19
Да, конечно, вы можете добавить один, как уже упоминалось, для инициализации абстрактных переменных класса. НО, если вы явно не объявляете одно, у него всегда есть неявный конструктор для «Constructor Chaining».
Ответ 20
Назначение конструктора в классе используется для инициализации полей, но не для «создания объектов». Когда вы пытаетесь создать новый экземпляр абстрактного суперкласса, компилятор выдаст вам ошибку. Однако мы можем наследовать абстрактный класс Employee и использовать его конструктор, устанавливая его переменные. См. Пример ниже.
Ответ 21
открытый класс AbstractClassConstructor <
Ответ 22
Да.. Это похоже на любой другой класс. Он может иметь конструктор и вызывается после создания объекта для базового класса.
Какой смысл создавать конструктор для абстрактного класса в Java?
Я хотел бы знать, какой цели служит конструктор для абстрактного класса; поскольку мы не создаем экземпляры абстрактных классов, зачем нам вообще нужен такой конструктор?
8 ответов
будут времена, когда у вас будет некоторая общая инициализация переменных экземпляра, которые необходимо настроить всем наследующим классам. Вы создаете экземпляр абстрактного класса при его расширении, и этот конкретный класс имеет конструктор, который будет либо предоставлять параметры конструктору абстрактного класса.
Они все еще могут вызываться конструкторами классов, которые наследуют от этого, что делает рефакторинг кода хорошим использованием для наличия конструктора в абстрактном классе.
Если у вас есть неинициализированные конечные поля в абстрактном классе, вам нужно будет инициализировать их в конструкторе.
Если ваш класс не объявляет конструктор, javac сделает для вас конструктор no-arg, do-nothing. Затем, когда ваш подкласс инициализирован, он вызовет сгенерированный конструктор no-op, и жизнь хороша.
однако, если ваш класс объявляет любой конструктор, javac не сделает его для вас. В этом случае, конструктор подкласса должен явно вызвать конструктор родительского класса. В противном случае вам не удастся инициализировать членов родительского класса, как указано выше ответ упоминает.
конструкторы для абстрактных классов используются подклассами (вызываются из конструкторов подклассов с помощью super(params) ).
вы должны сделать эти конструкторы protected чтобы внести ясность.
вы не создаете абстрактные классы, но конструктор вызывается при создании экземпляра подкласса.
использование может быть для инициализации общих атрибутов ie.
де-дублирование общих знаний / поведения.
Я согласен, конструкторы создаются при условии, что будут экземпляры. Если у вас много общего кода, Вы можете подумать о создании конструктора, но гораздо лучше поместить его в init() метод.
Может ли абстрактный класс иметь конструктор?
абстрактный класс может иметь конструктор?
Если да, то как его можно использовать и для каких целей?
21 ответов
да, абстрактный класс может иметь конструктор. Рассматривайте это:
суперкласс Product является абстрактным и имеет конструктор. Конкретный класс TimesTwo имеет конструктор, который просто жестко кодирует значение 2. Конкретный класс TimesWhat имеет конструктор, который позволяет звонящему указать значение.
абстрактные конструкторы часто будут использоваться для обеспечения ограничений класса или инвариантов, таких как минимальные поля, необходимые для настройки класс.
Примечание: поскольку в Родительском конструкторе нет конструктора по умолчанию (или no-arg абстрактный класс, конструктор, используемый в подклассе, должен явно вызывать родительский конструктор.
вы определите конструктор в абстрактном классе, если вы находитесь в одной из следующих ситуаций:
в любом случае, не забывайте, что если вы не определите конструктор, тогда компилятор автоматически сгенерирует его для вас (он является общедоступным, не имеет аргумента и ничего не делает).
Да, он может иметь конструктор, и он определен и ведет себя так же, как конструктор любого другого класса. За исключением того, что абстрактные классы не могут быть непосредственно созданы, только расширены, поэтому использование всегда из конструктора подкласса.
да! абстрактные классы могут иметь конструкторы!
Да, когда мы определяем класс как абстрактный класс, он не может быть создан, но это не означает, что абстрактный класс не может иметь конструктор. Каждый абстрактный класс должен иметь конкретный подкласс, который будет реализовывать абстрактные методы, что абстрактный класс.
когда мы создаем объект любого подкласса все конструкторы в соответствующем дереве наследования вызываются в подход сверху вниз. То же самое относится и к абстрактным классам. Хотя мы не можем создать объект абстрактного класса, когда мы создаем объект класса, который является конкретным и подкласс абстрактного класса, конструктор абстрактного класса вызывается автоматически. Следовательно, мы можем иметь конструктор в абстрактных классах.
Примечание: не-абстрактный класс не может иметь абстрактные методы, но абстрактный класс может иметь не-абстрактный метод. Причина аналогична конструкторы, разница в том, что вместо автоматического вызова мы можем вызвать super (). Кроме того, нет ничего похожего на абстрактный конструктор, поскольку он вообще не имеет смысла.
не только может, это всегда так. Если вы не укажете один, то у него нет конструктора arg по умолчанию, как и у любого другого класса. Фактически, все классы, включая вложенные и анонимные классы, получат конструктор по умолчанию, если он не указан (в случае анонимных классов его невозможно указать, поэтому вы всегда получите конструктор по умолчанию).
хорошим примером абстрактного класса, имеющего конструктор, является календарь класса. Вы получаете Объект календаря путем вызова Calendar.getInstance (), но также имеет защищенные конструкторы. Причина, по которой его конструкторы защищены, заключается в том, что только его подклассы могут вызывать их (или классы в одном пакете, но поскольку это абстрактно, это не применяется). GregorianCalendar является примером класса, который расширяет календарь.
Да, это может, абстрактные классы конструкторы обычно используются для супер-вызовов событий инициализации, общих для всех подклассов
абстрактный класс может иметь конструктор, но вы не можете создать объект абстрактного класса, так как вы можете использовать этот конструктор?
дело в том, что когда вы наследуете этот абстрактный класс в своем подклассе, вы можете передавать значения его(абстрактного) конструктору через метод super(value) в своем подклассе, и нет, вы не наследуете конструктор.
таким образом, используя super, вы можете передавать значения в конструкторе абстрактного класса, и, насколько я помню, он должен быть первым оператор в вашем методе или конструкторе.
хотя есть много хороших ответов, я хотел бы дать мои 2 цента.
конструктор НЕ СОЗДАЕТ ОБЪЕКТ. Он используется для инициализации объекта.
да, абстрактный класс всегда имеет конструктор. Если вы не определяете свой собственный конструктор, компилятор даст конструктор по умолчанию абстрактному классу. Выше справедливо для всех классов-вложенных, абстрактных, анонимных и т. д.
абстрактный класс (В отличие от интерфейса) могут иметь non-final нестатические поля, которые нуждаются в инициализации. Для этого вы можете написать свой собственный конструктор в абстрактном классе. Но в этом случае не будет никакого конструктора по умолчанию.
будьте осторожны при расширении выше абстрактного класса, вы должны явно вызвать super из каждого конструктора. Первая строка любого конструктора вызывает super (). если вы явно не вызываете super (), Java сделает это за вас. Ниже код не будет компилироваться:
у вас есть чтобы использовать его, как показано ниже пример:
рассмотрим следующий пример:
суперкласс является абстрактным и имеет конструктор.
конечно, абстрактный класс может иметь конструктор.Обычно конструктор класса используется для инициализации полей.Таким образом, конструктор абстрактного класса используется для инициализации полей абстрактного класса. Вы бы предоставили конструктор для абстрактного класса, если хотите инициализировать определенные поля абстрактного класса до создания экземпляра дочернего класса. Абстрактный конструктор класса также может использоваться для выполнения кода, соответствующего каждому дочернему классу. Это предотвращает код дублирование.
мы не можем создать экземпляр абстрактного класса, но мы можем создать экземпляры классов, производных от абстрактного класса. Таким образом, при создании экземпляра производного класса автоматически вызывается родительский конструктор абстрактного класса.
в конкретном классе объявление конструктора для конкретного типа Fnord эффективно предоставляет две вещи:
средство, с помощью которого код может запросить создание экземпляра Fnord
средство, с помощью которого экземпляр типа, производного от Fnord который находится в стадии разработки, может запросить инициализацию всех функций базового класса.
хотя, возможно, должно быть средство, с помощью которого эти две способности могут быть контролируемый отдельно, для каждого конкретного типа одно определение позволит. Хотя первая способность не имеет значения для абстрактного класса, вторая способность так же важна для абстрактного класса, как и для любого другого, и поэтому ее объявление так же необходимо и полезно.
Зачем в абстрактном базовом классе создавать конструктор?
Здравствуйте!
В литературе что я читаю автор в АБК создает конструктор:
Вопрос: зачем создавать явный конструктор для АБК, если его объект создать нельзя (при наличии чистой виртуальной функции конечно) и вопрос второй: что за странный вызов конструктора АБК в конструкторе производного класса? Спасибо
Простой 3 комментария
и т.д. у него есть закрытые члены, доступ к которым имеет только сам класс
Абстрактные классы делят на интерфейсы и частично реализованные. Грань между ними такова:
• Интерфейс не имеет данных.
• У интерфейса все неабстрактные виртуальные методы представляют собой или эталонное поведение, или самую частую реализацию. В обоих случаях, если что, их надо не расширять, а переписывать с нуля.
Так вот, для интерфейсов таких конструкторов, разумеется, не нужно.
Например, между абстрактным потоком и файлом Win32 может быть такая иерархия: Stream → HandleStream → File. Stream — интерфейс, даже если там есть что-то типа
HandleStream содержит уже данные (дескриптор Win32), и это уже частично реализованный класс, который крутится вокруг этого дескриптора: в деструкторе вызов CloseHandle, конструктор может принимать дескриптор, полученный каким-то «левым» образом.
Вот в таких полуреализованных классах, разумеется, конструктор может инициализировать те данные, которые там есть.
sddvxd, Недореализованный класс создаёт некий кусок функциональности, оставляя какие-то места конкретным потомкам.
Второй пример, из Delphi: TComponent реализует постановку на форму, загрузку и сохранение. TGraphicControl даёт компоненту графический вид, TWinControl — дескриптор окна Win32, TCustomControl — ещё кучу функций, позволяющих написать свой компонент с нуля.
В отличие от интерфейса, который создаёт только «морду» без реализации. (В идеале, в реальной жизни бывают эталонные реализации, которые могут стать заглушкой или документацией, бывают утилиты, которые из виртуальных функций создают более высокоуровневые агрегаты, бывают реализации, которые верны для 80% потомков)
Для абстрактных интерфейсных классов не нужно делать вызов конструктора и производном классе из-за того, что в нем нет данных, а только функции
Верно. Только «интерфейсный класс» не говорят, и в данном случае интерфейс — это как «интерфейс RS-232», то есть стандартный метод взаимодействия. Никаким пользовательским интерфейсом тут и не пахнет.
Вызов конструктора родителя делается для изменения данных такового, в случае с File проверяем доступность дескриптора вызовом конструктора HandleStream
Эталонная реализация — функция remainder из ответа.
Реализация, верная для большинства потомков,— ну, например.
Например, не могут позиционировать порты, каналы, архивы (последние теоретически могут, но долго, сложно и редко нужно).
Делают для того, чтобы он мог своими силами инициализировать имеющиеся у него данные. Допустим, инициализируем пустым дескриптором, а там уже разберёмся с файлом и попробуем заменить пустой на правильный — или поднять тревогу.
Может ли абстрактный класс иметь конструктор?
абстрактный класс может иметь конструктор?
Если да, то как его можно использовать и для каких целей?
21 ответов:
да, абстрактный класс может иметь конструктор. Рассмотрим это:
суперкласс Product является абстрактным и имеет конструктор. Конкретный класс TimesTwo имеет конструктор, который просто жестко кодирует значение 2. Конкретный класс TimesWhat имеет конструктор, который позволяет звонящему указать значение.
абстрактные конструкторы часто используются для применения ограничений класса или инвариантов, таких как минимальные поля, необходимые для установки класс.
Примечание: поскольку нет конструктора по умолчанию (или no-arg) в родительском элементе абстрактный класс, конструктор, используемый в подклассе должен явно вызывать родительский конструктор.
вы определите конструктор в абстрактном классе, если вы находитесь в одной из следующих ситуаций:
в любом случае, не забывайте, что если вы не определите конструктор, затем компилятор автоматически сгенерирует его для вас (этот является общедоступным, не имеет аргумента и ничего не делает).
Да, он может иметь конструктор, и он определен и ведет себя так же, как конструктор любого другого класса. За исключением того, что абстрактные классы не могут быть непосредственно созданы, только расширены, поэтому использование всегда происходит из конструктора подкласса.
да! абстрактные классы могут иметь конструкторы!
Да, когда мы определяем класс как абстрактный класс, он не может быть создан, но это не означает, что абстрактный класс не может иметь конструктор. Каждый абстрактный класс должен иметь конкретный подкласс, который будет реализовывать абстрактные методы, что абстрактный класс.
при создании объекта любого подкласса все конструкторы в соответствующем дереве наследования вызываются в подход сверху вниз. То же самое относится и к абстрактным классам. Хотя мы не можем создать объект абстрактного класса, когда мы создаем объект класса, который является конкретным и подкласс абстрактного класса, конструктор абстрактного класса вызывается автоматически. Следовательно, мы можем иметь конструктор в абстрактных классах.
Примечание: не-абстрактный класс может иметь абстрактные методы, но абстрактный класс может иметь неабстрактный метод. Причина подобна тому из конструкторы, разница в том, что вместо автоматического вызова мы можем вызвать super (). Кроме того, нет ничего похожего на абстрактный конструктор, поскольку это вообще не имеет смысла.
не только может, он всегда так делает. Если вы не укажете один, то он имеет конструктор arg по умолчанию, как и любой другой класс. Фактически, все классы, включая вложенные и анонимные классы, получат конструктор по умолчанию, если он не указан (в случае анонимных классов невозможно указать один, поэтому вы всегда получите конструктор по умолчанию).
хорошим примером абстрактного класса с конструктором является календарь класса. Вы получаете Объект календаря путем вызова календаря.getInstance (), но он также имеет конструкторы, которые защищены. Причина, по которой его конструкторы защищены, заключается в том, что только его подклассы могут вызывать их (или классы в одном пакете, но поскольку он абстрактен, это не применяется). GregorianCalendar является примером класса, который расширяет календарь.
Да, это может быть, абстрактные конструкторы классов обычно используются для супер-вызовов событий инициализации, общих для всех подклассов
абстрактный класс может иметь конструктор, но вы не можете создать объект абстрактного класса, так как вы можете использовать этот конструктор?
дело в том, что когда вы наследуете этот абстрактный класс в своем подклассе, вы можете передавать значения его(абстрактного) конструктора через метод super(value) в своем подклассе, и нет, вы не наследуете конструктор.
таким образом, используя super вы можете передавать значения в конструкторе абстрактного класса и, насколько я помню, он должен быть первым оператор в вашем методе или конструкторе.
хотя есть много хороших ответов, я хотел бы дать мои 2 цента.
конструктор НЕ СТРОИТ ОБЪЕКТ. Он используется для инициализации объекта.
абстрактный класс (В отличие от интерфейса) могут иметь неокончательные нестатические поля, которые нуждаются в инициализации. Вы можете написать свой собственный конструктор в абстрактном классе, чтобы сделать это. Но, в этом случае, не будет никакого конструктора по умолчанию.
будьте осторожны при расширении выше абстрактного класса, вы должны явно вызвать super из каждого конструктора. Первая строка любого конструктора вызывает super (). если вы явно не вызываете super (), Java сделает это за вас. Ниже код не будет компилироваться:
у вас есть чтобы использовать его, как показано ниже пример:
суперкласс является абстрактным и имеет конструктор.
конечно, абстрактный класс может иметь конструктор.Обычно конструктор класса используется для инициализации fields.So, абстрактный конструктор класса используется для инициализации полей абстрактного класса. Вы можете предоставить конструктор для абстрактного класса, если хотите инициализировать определенные поля абстрактного класса до создания экземпляра дочернего класса. Абстрактный конструктор класса также может быть использован для выполнения кода, относящегося к каждому дочернему классу. Это предотвращает код дублирование.
мы не можем создать экземпляр абстрактного класса, но мы можем создать экземпляры классов, которые являются производными от абстрактного класса. Таким образом, при создании экземпляра производного класса автоматически вызывается родительский конструктор абстрактного класса.
в конкретном классе объявление конструктора для конкретного типа Fnord эффективно предоставляет две вещи:
средство, с помощью которого код может запросить создание экземпляра Fnord
средство, с помощью которого экземпляр типа, производного от Fnord который находится в стадии разработки может запросить, чтобы все функции базового класса были инициализированы.
хотя, возможно, должны быть средства, с помощью которых эти две способности могут быть контролируемый отдельно, для каждого конкретного типа одно определение позволит. Хотя первая способность не имеет значения для абстрактного класса, вторая способность имеет такое же значение для абстрактного класса, как и для любого другого, и поэтому ее объявление так же необходимо и полезно.