Виртуальный против абстрактного
Виртуальный и абстрактный - два ключевых слова, используемых в большинстве объектно-ориентированных языков программирования, таких как Java и C #. Хотя есть небольшие различия в том, что это означает на разных языках, ключевые слова Virtual и Abstract дают ощущение частичной реализации сущностей, к которым они присоединяются.
абстрактный
Как правило, абстрактные классы, также известные как абстрактные базовые классы (ABC), не могут быть созданы (экземпляр этого класса не может быть создан). Итак, абстрактные классы имеют смысл иметь только в том случае, если язык программирования поддерживает наследование (возможность создавать подклассы из расширения класса). Абстрактные классы обычно представляют абстрактное понятие или сущность с частичной реализацией или без нее. Следовательно, абстрактные классы действуют как родительские классы, от которых производятся дочерние классы, так что дочерний класс будет разделять неполные функции родительского класса, а для их завершения можно добавить функциональные возможности. Абстрактные классы могут содержать абстрактные методы. Подклассы, расширяющие абстрактный класс, могут реализовывать эти (унаследованные) абстрактные методы. Если дочерний класс реализует все такие абстрактные методы, это конкретный класс. Но если этого не произойдет,дочерний класс также становится абстрактным классом. Все это означает, что, когда программист назначает класс абстрактным, он говорит, что класс будет неполным и в нем будут элементы, которые должны быть завершены наследующими подклассами. Это хороший способ заключить контракт между двумя программистами, который упрощает задачи при разработке программного обеспечения. Программист, который пишет код для наследования, должен точно следовать определениям методов (но, конечно, может иметь свою собственную реализацию). В Java и C # абстрактные классы и методы объявляются с использованием ключевого слова Abstract. Это хороший способ заключить контракт между двумя программистами, который упрощает задачи при разработке программного обеспечения. Программист, который пишет код для наследования, должен точно следовать определениям методов (но, конечно, может иметь свою собственную реализацию). В Java и C # абстрактные классы и методы объявляются с использованием ключевого слова Abstract. Это хороший способ заключить контракт между двумя программистами, который упрощает задачи при разработке программного обеспечения. Программист, который пишет код для наследования, должен точно следовать определениям методов (но, конечно, может иметь свою собственную реализацию). В Java и C # абстрактные классы и методы объявляются с использованием ключевого слова Abstract.
Виртуальный
Виртуальные методы / функции предоставляют возможность при желании переопределить его поведение наследующим классом (используя функцию с той же сигнатурой). Концепция виртуальной функции важна в следующем сценарии. Предположим, что класс является производным от дочернего класса, тогда всякий раз, когда используется объект производного класса, он может ссылаться на объект базового класса или производного класса. Но поведение вызова метода может быть неоднозначным, если методы базового класса переопределены. Итак, чтобы устранить эту двусмысленность, используется ключевое слово Virtual. Если метод помечен как виртуальный, то вызывается функция производного класса (если есть) или вызывается функция базового класса. Например, в C ++ ключевое слово Virtual используется именно для этой цели. В C # ключевое слово Virtual используется аналогичным образом, но, кроме того,ключевое слово override следует использовать для изменения всех переопределенных методов. Но в Java нет явного ключевого слова Virtual. Все нестатические методы считаются виртуальными. Виртуальные функции без тела называются чистыми виртуальными функциями. В Java и C # абстрактные методы фактически являются чистыми виртуальными.
Разница между виртуальным и абстрактным
Хотя Abstract и Virtual - это два ключевых слова / понятия, которые придают значение неполной реализации связанных с ним сущностей, у них есть свои различия. Абстрактные методы (которые должны быть определены внутри абстрактных классов) вообще не имеют реализации, тогда как виртуальные методы могут иметь реализацию. Если абстрактные методы расширяются конкретным классом, все унаследованные абстрактные методы должны быть реализованы, в то время как унаследованные виртуальные методы могут быть или не могут быть переопределены.