что такое абстрактная функция
ООП. Часть 6. Абстрактные классы и интерфейсы
Узнайте истинную мощь наследования и полиморфизма! Раскрываем секреты абстрактных классов и интерфейсов.
В предыдущей статье мы увидели, насколько удобнее становится ООП благодаря наследованию. Но оно может стать ещё лучше, если использовать абстрактные классы и интерфейсы.
Все статьи про ООП
Пишет о программировании, в свободное время создает игры. Мечтает открыть свою студию и выпускать ламповые RPG.
Абстрактные классы
Особенность абстрактных классов в том, что их можно использовать только как родительский класс, то есть вы не можете создать объект. Для их объявления используется ключевое слово abstract.
Это может понадобиться, чтобы объединить реализацию других схожих классов. Например, в вашей игре должны быть персонаж игрока и NPC (неигровые персонажи). У них могут быть общие свойства (имя, координаты) и методы (перемещение, изменение анимации).
Чтобы не повторять код несколько раз, можно вынести реализацию этих свойств и методов в абстрактный класс Character:
Тут всё как у обычных классов, но в конце можно заметить объявление свойства и метода без реализации. Реализация этих абстрактных свойств должна находиться в дочернем классе:
Когда объявляется реализация такого члена класса, необходимо указать ключевое слово override. Абстрактными могут быть следующие члены класса:
Дочерний класс должен реализовывать все члены родительского абстрактного класса, кроме тех случаев, когда дочерний класс тоже абстрактный.
В остальном всё очень похоже на обычные классы. Например, поле Y класса Character публичное, чтобы можно было использовать его в свойстве Y дочерних классов.
Абстрактный класс должен быть публичным.
Чем отличаются абстрактные функции от виртуальных?
Чем отличаются абстрактные функции от виртуальных?
4 ответа 4
Абстрактная функция указывает на то, что в данном классе нет реализации этой функции, но она должна быть реализована в классах-потомках.
Абстрактные функции бывают полезны, когда от класса-предка наследуются несколько классов-потомков с различными реализациями одного и того же действия. Тогда, используя переменную типа класса-предка с абстрактной функцией, можно вызывать эту функцию. В зависимости от того, на объект какого класса указывает переменная, будет вызвана нужная реализация функции.
Поэтому абстрактными могут быть только виртуальные функции.
Обычно создание объекта класса, имеющего абстрактные функции, приводит к выводу компилятором предупреждения. А вызов абстрактной функции во время выполнения обычно приводит к выводу ошибки.
В потомках переопределять можно любые функции, в чем фишка вируальной?
Разница именно в том, что виртуальный метод переопределяет реализацию базового класса, а не виртуальнай нет. Т.е. если бы php разделял методы на виртуальные и не виртуальные, то следующий код:
Абстрактная функция является виртуальной, но у неё нет тела. Это просто пустое место, зарезервированное для функции, которая должна быть определена в классе-потомке.
Если утрировать, то можно сказать, что в пхп методы поумолчанию виртуальные, то есть автоматически будет выполняться метод определенный на самом верху, а в С++ наоборот, надо указывать virtual, что бы методы базового класса использовали переопределенный метод, те:
Но если в классе Base функцию getName() объявить как virtual, то результат будет одинаковым.
При этом в С++ нет ключевого слова abstract и для объявления абстрактной функции просто создают функцию без тела и объявляя её как виртуальную, последнее нужно именно для того чтобы базовый класс искал её реализацию в дочерних классах, а не пытался выполнить не имплементированную функцию.
С# для AS3 разработчиков. Часть 4: Абстрактные классы и функции
В этой статье мы наконец-то начнём разбираться в нюансах C#, аналогов которых нет в AS3. И первым делом мы рассмотрим абстрактные классы и функции. В AS3 необходимо было придумывать обходные пути, чтобы они работали правильно на этапе исполнения (run-time). Но C# предоставляет возможность заставить их работать на этапе компиляции (compile-time), и сегодня мы разберём эти способы.
Но, до этого, я бы хотел рассказать об одной особенности AS3 классов, о которой я забыл рассказать в предыдущих статьях: статические инициализаторы (static initializers), так же известные как инициализаторы класса, конструкторы класса или статические конструкторы. Это – функция, которая будет вызвана автоматически, когда статические поля класса должны быть инициализированы. Вот, как это выглядело в AS3:
Статические инициализаторы используются не часто, т.к. у нас есть возможность объявлять и инициализировать поля в одно и то же время. Например:
Но, они могут быть полезны, если необходимо реализовать более сложную логику поведения приложения. В любом случае, вот, как это может быть реализовано в C#:
Статические инициализаторы в C# называются “статическими конструкторами” и работают по аналогии с обычными конструкторами, но не для отдельных экземпляров классов, а для всего класса целиком. Синтаксис подобных конструкторов совпадает с обычными, но в начале объявления конструктора добавляется ключевое слово static. У данных конструкторов не может быть модификаторов доступа (private, public и т.п.) и они не могут принимать входящие параметры.
А теперь, давайте поговорим об абстрактных классах: это – такие классы, которые не могут быть инстанциированы напрямую. Чтобы создать экземпляр абстрактного класса, вам необходимо будет создать не абстрактный класс, который будет наследоваться от абстрактного, и инстанциировать этот не абстрактный класс. По-умолчанию в AS3 нет подобного функционала на этапе компиляции, но, существует довольно популярный способ обойти это ограничение:
В данном случае создание ExtrudedShape напрямую всё ещё возможно, и подобный код будет компилироваться:
Но на этапе исполнения сработает проверка первого аргумента, что повлечёт за собой появление ошибки ArgumentError, и экземпляр ExtrudedShape не будет создан. Это произойдёт из-за того, что классы, не унаследованные от ExtrudedShape не будут иметь доступа к protected константе HIDDEN_KEY, но, в то же время, классы-производные от ExtrudedShape смогут обращаться к этой переменной для передачи в родительский конструктор:
Это – довольно эффективный способ реализации абстрактных классов на этапе проигрывания, но C# предоставляет возможность сделать всю работу на этапе компиляции:
Обратите внимание на использование ключевого слова abstract вначале класса. Оно означает, что компилятор не должен разрешать создание данного класса напрямую. Данный подход не требует дополнительного кода или “обходных путей”, которые необходимы в AS3 (производным классам не нужно использовать HIDDEN_KEY, а их инициализация и объявление выглядит точно так же, как и у других классов):
Абстрактные функции используются в тех случаях, когда необходимо указать, что реализация определённой функции, обязательно должна быть переопределена в дочернем классе. И снова, в AS3 нет возможности реализовать подобное на этапе компиляции, но, как и в случае с абстрактными классами, существует способ обойти это ограничение:
В данном примере класс ExtrudedShape не реализует функционал функции get area, так как он ничего не знает о ней. В данной версии, обращение к функции get area класса ExtrudedShape вызовет ошибку. Данный подход позволяет реализовать абстрактные функции на этапе воспроизведения, но не на этапе компиляции. Например, следующий код будет успешно компилироваться без реализации функции get area:
Вместо этого, в C# мы можем просто использовать ключевое слово abstract:
Это же ключевое слово будет использоваться для обычных функций (не геттер/сеттер):
Сегодня мы обсудили абстрактные классы и функции, а так же статические инициализаторы. Для закрепления, давайте сравним особенности реализации этого функционала в C# и AS3:
В следующей статье мы поговорим о деструкторах, трюках при работе с перегрузкой конструкторов и о многом другом.
В чем разница между абстрактной функцией и виртуальной функцией?
в чем разница между абстрактной функцией и виртуальной функцией? В каких случаях рекомендуется использовать virtual или abstract? Какой подход более правильный?
23 ответов
абстрактная функция не может иметь функциональность. вы в основном говорите, что любой дочерний класс должен дать свою собственную версию этого метода, однако он слишком общий, чтобы даже пытаться реализовать в родительском классе.
виртуальная функция, в основном говорит, что посмотрите, вот функциональность, которая может быть или не быть достаточно хороша для дочернего класса. Поэтому, если это достаточно хорошо, используйте этот метод, если нет, то переопределите меня и предоставьте свой собственный функциональность.
абстрактная функция не имеет имплементации и может быть объявлена только в абстрактном классе. Это заставляет производный класс предоставлять реализацию. Виртуальная функция предоставляет реализацию по умолчанию и может существовать как в абстрактном, так и в неабстрактном классе. Так например:
вы всегда должны переопределить абстрактные функции.
абстрактный метод: Когда класс содержит абстрактный метод, то класс должен быть объявлен как абстрактный. Абстрактный метод не имеет реализации и, следовательно, классы, производные от абстрактного класса, должны обеспечивать реализацию этого абстрактного метода.
виртуальный метод: Класс может иметь виртуальный метод. Виртуальный метод имеет реализацию. Когда вы наследуете от класса, который имеет виртуальный метод, вы can переопределить виртуальный метод и обеспечить дополнительная логика или замените логику своей собственной реализацией.
когда использовать: В некоторых случаях вы знаете, что определенные типы должны иметь определенный метод, но вы не знаете, какую реализацию должен иметь этот метод.
В таких случаях можно создать интерфейс, содержащий метод с этой сигнатурой. Однако, если у вас есть такой случай, но вы знаете, что разработчики этого интерфейса также будут иметь другой общий метод (для которого вы уже можете предоставить реализации), вы можете создать абстрактный класс. Затем этот абстрактный класс содержит абстрактный метод (который должен быть переопределен) и другой метод, содержащий «общую» логику.
виртуальный метод должен использоваться, если у вас есть класс, который можно использовать напрямую, но для которого вы хотите, чтобы наследники могли изменять определенное поведение, хотя это не обязательно.
пояснение: по аналогии. надеюсь, это поможет вам.
контекст
Я работаю на 21-м этаже здания. И я параноик огня. Время от времени где-то в мире горит небесный скребок. Но, к счастью, у нас есть инструкция где-то здесь, что делать в случае пожара:
FireEscape()
Это в основном виртуальный метод, называемый FireEscape()
Виртуальный Метод
этот план довольно хорош для 99% обстоятельств. Это основной план, который работает. Но есть 1% шанс, что пожарная лестница заблокирована или повреждена, и в этом случае вы полностью ввернуты, и вы станете тостом, если не предпримете каких-то радикальных действий. С помощью виртуальных методов вы можете сделать просто: вы можете переопределить базовый план FireEscape () своей собственной версией плана:
другими словами виртуальные методы предоставляют базовый план, который может быть переопределен, если вам нужно. Подклассы могут переопределять виртуальный метод родительского класса, если программист сочтет это целесообразным.
Аннотация методы
Не все организации скважины. Некоторые организации не проводят пожарных учений. У них нет общей политики побега. Каждый человек сам за себя. Руководство заинтересовано только в такой существующей политике.
в чем разница между этими двумя снова?
абстрактный метод: подклассы заставили реализовать свой собственный метод FireEscape. С помощью виртуального метода у вас есть базовый план, ожидающий вас, но вы можете выбрать реализовать свой собственный если это недостаточно хорошо.
теперь это было не так сложно, не так ли?
абстрактный метод-это метод, который должен быть реализован к конкретному классу. Объявление находится в абстрактном классе (и любой класс с абстрактным методом должен быть абстрактным классом) и должно быть реализовано в конкретном классе.
виртуальный метод-это метод, который может быть переопределен в производном классе, используя переопределение, замена поведение в суперклассе. Если вы не переопределите, вы получите исходное поведение. Если вы делаете, вы всегда получите новое поведение. Это противопоставляется не виртуальным методам, которые нельзя переопределить, но можно скрыть исходный метод. Это делается с помощью new модификатор.
рассмотрим следующий пример:
абстрактные методы неявно виртуальны. Они определяют поведение, которое должно присутствовать, больше похоже на интерфейс.
абстрактные методы всегда являются виртуальными. Они не могут иметь реализации.
Это главное отличие.
в принципе, вы бы использовали виртуальный метод, если у вас есть его реализация по умолчанию и вы хотите, чтобы потомки изменили его поведение.
с помощью абстрактного метода вы заставляете потомков предоставлять реализацию.
Я сделал это проще, сделав некоторые улучшения в следующих классах (из других ответов):
позднее связывание означает, что мы используем имя, но отложить сопоставление. Другими словами, сначала мы создаем / упоминаем имя и позволяем некоторому последующему процессу обрабатывать сопоставление кода с этим именем.
Итак, короткий ответ: virtual является поздней инструкцией привязки для машины (время выполнения), тогда как abstract является поздней инструкцией привязки для человека (программиста)
другими словами, virtual означает:
«уважаемый время работы, привязать соответствующий код к этому имени, делая то, что вы делаете лучше всего:поиск«
, тогда как abstract означает:
«дорогой программист, пожалуйста, привязать соответствующий код к этому имени, делая то, что вы делаете лучше всего:изобретая«
для полноты, перегрузка означает:
«уважаемый компилятор, привязать соответствующий код к этому имени, делая то, что вы делаете лучше всего:сортировка«.
вы в основном используете виртуальный метод, когда хотите, чтобы наследники расширяли функциональность, если они хотят.
вы используете абстрактные методы, когда хотите, чтобы наследники реализовали функциональность (и в этом случае у них нет выбора)
Я видел в некоторых местах абстрактный метод определяется как ниже. **
«абстрактный метод должен быть реализован в дочернем классе»
1)абстрактный метод не могу быть частным методом. 2) An Абстрактный метод не могу быть реализован в том же абстрактном классе.
нет необходимости реализовывать виртуальный метод в унаследованном классе.
Виртуальный Метод:
Virtual означает, что мы можем переопределить его.
виртуальная функция не имеет реализации. Когда мы наследуем класс мы можно переопределить виртуальную функцию и предоставить собственную логику.
Абстрактный Метод
Abstract означает, что мы должны переопределить его.
абстрактная функция не имеет реализации и должна находиться в абстрактном классе.
его можно только объявить. Это заставляет производный класс предоставлять его реализацию.
абстрактный член неявно является виртуальным. Реферат может в некоторых языках его называют Чистым виртуальным.
абстрактную функцию не может иметь тела и должен быть переопределен дочерними классами
Виртуальная Функция будет тело и может или не может быть переопределена в классах детей
большинство приведенных выше примеров используют код-и они очень очень хороши. Мне не нужно добавлять к тому, что они говорят, но следующее простое объяснение, которое использует аналогии, а не код/технические термины.
простое объяснение-объяснение с использованием аналогий
Абстрактный Метод
Виртуальный Метод
Дэвид Петреус высоко в армии. Он определил, что означает борьба:
частная работа Bloggs читает приказ Петреуса и получает разрешение реализовать свою собственную версию боя, в соответствии с его конкретным требования:
разница между двумя!—4—>
Джордж Буш не доказывает никаких деталей реализации. Это должен сделать кто-то другой. Это абстрактный метод.
Петреус с другой стороны тут предоставьте детали реализации, но он дал разрешение своим подчиненным переопределить его приказы с их собственной версией, если они могут придумать что-то лучше.
В чем разница между абстрактной функцией и виртуальной функцией?
В чем разница между абстрактной функцией и виртуальной функцией? В каких случаях рекомендуется использовать виртуальный или абстрактный? Какой из них лучший?
ОТВЕТЫ
Ответ 1
Абстрактная функция не может иметь функциональность.. Вы в основном говорите, что любой дочерний класс ДОЛЖЕН дать собственную версию этого метода, однако он слишком общий, чтобы даже попытаться реализовать в родительском классе.
Виртуальная функция, в основном говорит о взгляде, здесь функции, которые могут или не могут быть достаточно хорошими для дочернего класса. Поэтому, если это достаточно хорошо, используйте этот метод, если нет, то переопределите меня и предоставите свои собственные функции.
Ответ 2
Абстрактная функция не имеет реализации и может быть объявлена только в абстрактном классе. Это заставляет производный класс предоставлять реализацию.
Виртуальная функция обеспечивает реализацию по умолчанию и может существовать в абстрактном или неабстрактном классе.
Ответ 3
Ответ 4
Вы всегда должны переопределять абстрактную функцию.
Ответ 5
Ответ 6
Абстрактный метод: Когда класс содержит абстрактный метод, этот класс должен быть объявлен как абстрактный. Абстрактный метод не имеет реализации и, следовательно, классы, которые вытекают из этого абстрактного класса, должны обеспечивать реализацию этого абстрактного метода.
Виртуальный метод: Класс может иметь виртуальный метод. Виртуальный метод имеет реализацию. Когда вы наследуете класс, который имеет виртуальный метод, вы можете переопределить виртуальный метод и предоставить дополнительную логику или заменить логику своей собственной реализацией.
Когда использовать что: В некоторых случаях вы знаете, что определенные типы должны иметь определенный метод, но вы не знаете, какую реализацию должен иметь этот метод.
В таких случаях вы можете создать интерфейс, содержащий метод с этой сигнатурой. Однако, если у вас есть такой случай, но вы знаете, что разработчики этого интерфейса также будут иметь еще один распространенный метод (для которого вы уже можете обеспечить реализацию), вы можете создать абстрактный класс. Этот абстрактный класс затем содержит абстрактный метод (который должен быть переопределен) и другой метод, который содержит «общую» логику.
Виртуальный метод следует использовать, если у вас есть класс, который можно использовать напрямую, но для которого вы хотите, чтобы наследователи могли изменять определенное поведение, хотя это необязательно.
Ответ 7
объяснение: с аналогиями. надеюсь, это поможет вам.
Контекст
Я работаю на 21-м этаже здания. И я параноик о пожаре. Время от времени, где-то в мире, огонь сжигает небоскреб. Но, к счастью, у нас есть инструкция по работе где-то здесь, что делать в случае пожара:
FireEscape()
Это виртуальный метод, называемый FireEscape()
Виртуальный метод
Другими словами, виртуальные методы обеспечивают базовый план, который может быть переоценен, если вам нужно. Подклассы могут переопределять виртуальный метод родительского класса, если программист считает это подходящим.
Абстрактные методы
Не все организации хорошо просверлены. Некоторые организации не выполняют противопожарные упражнения. У них нет общей политики побега. Каждый человек для себя. Менеджмент заинтересован только в такой существующей политике.
Другими словами, каждый человек вынужден разработать собственный метод FireEscape(). Один парень выйдет из пожарной лестницы. Другой парень будет парашютом. Другой парень будет использовать ракетные двигательные технологии, чтобы улететь из здания. Другой парень исчезнет. Менеджменту все равно, как вы избегаете, если у вас есть базовый план FireEscape(), если они не могут быть гарантированы. OHS придет к организации, как тонна кирпичей. Это то, что подразумевается под абстрактным методом.
Какая разница между двумя?
Абстрактный метод: подклассы принудительно выполняют собственный метод FireEscape. С помощью виртуального метода у вас есть базовый план, ожидающий вас, но вы можете реализовать его, если он недостаточно хорош.
Теперь это было не так сложно?
Ответ 8
См. следующий пример:
Абстрактные методы неявно виртуальны. Они определяют поведение, которое должно присутствовать, больше похоже на интерфейс.
Ответ 9
Абстрактные методы всегда являются виртуальными. У них не может быть реализации.
Это основное отличие.
В принципе, вы бы использовали виртуальный метод, если у вас есть реализация по умолчанию, и вы хотите, чтобы потомки меняли свое поведение.
С помощью абстрактного метода вы вынуждаете потомков предоставлять реализацию.
Ответ 10
Я сделал это проще, сделав некоторые улучшения в следующих классах (из других ответов):
Ответ 11
Позднее связывание означает, что мы используем имя, но откладываем отображение. Другими словами, мы сначала создаем/упоминаем имя и позволяем некоторому последующему процессу обрабатывать сопоставление кода с этим именем.
Другими словами, virtual означает:
«Дорогая среда выполнения, свяжите соответствующий код с этим именем, выполняя то, что вы делаете лучше всего: поиск»
В то время как abstract означает:
«Уважаемый программист, пожалуйста, свяжите соответствующий код с этим именем, выполняя то, что вы делаете лучше всего: изобретая»
Для полноты, перегрузка означает:
Msgstr «Уважаемый компилятор, свяжите соответствующий код с этим именем, выполняя то, что вы делаете лучше всего: сортировку».
Ответ 12
В основном вы используете виртуальный метод, когда хотите, чтобы наследники расширяли функциональность, если они хотят.
Вы используете абстрактные методы, когда хотите, чтобы наследователи реализовали функциональность (и в этом случае у них нет выбора)
Ответ 13
Я видел в некоторых местах абстрактный метод, как показано ниже. **
«Абстрактному методу необходимо реализовать в дочернем классе
** Я чувствовал, что это похоже.
Нет необходимости, чтобы абстрактный метод был реализован в дочернем классе, , если дочерний класс также является абстрактным.
1) Абстрактный метод не может быть приватным методом. 2) Абстрактный метод cant будет реализован в том же абстрактном классе.
Я бы сказал, что если мы реализуем абстрактный класс, вам придется переопределить абстрактные методы из базового абстрактного класса. Потому что.. Реализация абстрактного метода с ключевым словом переопределить. Подобно виртуальному методу.
Не обязательно, чтобы виртуальный метод был реализован в унаследованном классе.
Ответ 14
Виртуальный метод:
Виртуальный означает, что мы можем переопределить его.
Виртуальная функция имеет реализацию. Когда мы наследуем класс, мы можем переопределить виртуальную функцию и предоставить нашу собственную логику.
Абстрактный метод
Абстрактное означает, что мы ДОЛЖНЫ переопределить его.
Абстрактная функция не имеет реализации и должна быть в абстрактном классе.
Это можно только объявить. Это заставляет производный класс обеспечить его реализацию.
Абстрактный член неявно виртуален. Аннотация может называться чисто виртуальной в некоторых языках.
Ответ 15
Абстрактная функция не может иметь тело и ДОЛЖНА быть переопределена дочерними классами
Виртуальная функция будет иметь тело и может или не может быть переопределена дочерними классами
Ответ 16
Абстрактный метод
Виртуальный метод
Дэвид Петреус высоко в армии. Он определил, что означает борьба:
Частная работа Bloggs читает заказ Петреуса и получает разрешение на реализацию своей собственной версии боя в соответствии с его особыми требованиями:
Разница между двумя
Джордж Буш не доказывает детали реализации. Это должно быть сделано кем-то другим. Это абстрактный метод.
Petraeus, с другой стороны, предоставляет детали реализации, но он дал разрешение своим подчиненным переопределить свои заказы своей собственной версией, если они могут придумать что-то лучшее.
надеюсь, что это поможет.
Ответ 17
Абстрактная функция (метод):
● Это должно быть реализовано производным классом.
● Если метод абстрактный, то класс должен абстрактный.
виртуальная функция (метод):
● Это до производного класса, переопределить это или нет.
Ответ 18
Ответ 19
В С# нет ничего, что называется виртуальным классом.
Вы можете решить с вашим требованием.
Ответ 20
От общего объектно-ориентированного представления:
Относительно абстрактного метода. Когда вы помещаете абстрактный метод в родительский класс, вы говорите дочерним классам: Эй, обратите внимание, что у вас есть такая подпись метода. И если вы хотите использовать его, вы должны реализовать свои собственные!
Что касается виртуальной функции: когда вы помещаете виртуальный метод в родительский класс, вы говорите производным классам: Эй, здесь есть функциональность, которая что-то делает для вас. Если это полезно, просто используйте его. Если нет, переопределите это и внесите свой код, даже вы можете использовать мою реализацию в вашем коде!
это некоторая философия о различии между этими двумя понятиями в General OO
Ответ 21
Абстрактный метод не имеет реализации. Он объявлен в родительском классе. Дочерний класс ответственен за реализацию этого метода.
Виртуальный метод должен иметь реализацию в родительском классе, и это облегчает дочернему классу делать выбор, использовать ли эту реализацию родительского класса или иметь новую реализацию для этого метода в дочернем классе.
Ответ 22
Унаследованные экземпляры такого класса также наследуют реализацию, если вы ее не реализуете, в классе с более низкой иерархией.
Ответ 23
Исходя из фона C++, С# virtual соответствует виртуальному C++, в то время как абстрактные методы С# соответствуют чисто виртуальной функции C++.
Ответ 24
Фактически классы, которые наследуются от его абстрактного класса, должны давать реализацию этому методу, обычно компиляторы выдают ошибки, когда они этого не делают.
Использование абстрактных классов и методов важно, главным образом, во избежание того, чтобы при проектировании классов, концентрируясь на деталях реализации, структура классов была слишком связана с реализациями, поэтому создавались зависимости и связи между классами, которые сотрудничают между ними.
Они оба представляют форму полиморфизма в парадигме ориентации объекта.
Мы можем использовать абстрактные методы и виртуальные функции вместе для поддержки хорошей модели наследования.
Мы проектируем хорошую абстрактную структуру основных объектов нашего решения, затем создаем базовые реализации, находя их более склонными к дальнейшей специализации, и делаем их виртуальными, наконец, мы специализируем наши базовые реализации, в конечном итоге «переопределяя» унаследованные виртуальные.
Ответ 25
Здесь я пишу некоторый пример кода, надеясь, что это может быть довольно ощутимым примером, чтобы увидеть поведение интерфейсов, абстрактных классов и обычных классов на самом базовом уровне. Вы также можете найти этот код в github как проект, если вы хотите использовать его в качестве демонстрационной версии: https://github.com/usavas/JavaAbstractAndInterfaceDemo
Ответ 26
Если класс является производным от этого абстрактного класса, он вынужден переопределять абстрактный член. Это отличается от виртуального модификатора, который указывает, что элемент может быть переопределен.
Ответ 27
Насколько я понимаю:
Только абстрактный класс может содержать абстрактные методы. Также производному классу необходимо реализовать метод, и реализация не реализуется в классе.
Класс может объявить их, а также обеспечить их реализацию. Также производному классу необходимо реализовать метод, чтобы переопределить его.