Разница между виртуальным и абстрактным

Виртуальный против абстрактного

Virtual и Abstract - это два ключевых слова, используемых в большинстве объектно-ориентированных (ОО) языков программирования, таких как Java и C #. Хотя существуют небольшие различия в том, что это означает на разных языках, ключевые слова Virtual и Abstract обеспечивают ощущение частичной реализации сущностей, к которым оно присоединяется..

абстрактный

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

виртуальный

Виртуальные методы / функции предоставляют возможность необязательного переопределения его поведения наследующим классом (используя функцию с той же сигнатурой). Концепция Виртуальной функции важна в следующем сценарии. Предположим, что класс является производным от дочернего класса, тогда всякий раз, когда используется объект производного класса, он может ссылаться на объект базового класса или производного класса. Но поведение вызова метода может быть неоднозначным, если методы базового класса переопределены. Таким образом, для устранения этой неоднозначности используется ключевое слово Virtual. Если метод помечен как Виртуальный, то вызывается функция производного класса (если есть) или вызывается функция базового класса. Например, в C ++ ключевое слово Virtual используется именно для этой цели. В C # ключевое слово Virtual используется аналогичным образом, но кроме того, ключевое слово override должно использоваться для изменения всех переопределенных методов. Но в Java нет явного ключевого слова Virtual. Все нестатические методы считаются виртуальными. Виртуальные функции без тела называются Чистыми Виртуальными функциями. В Java и C # абстрактные методы на самом деле являются чисто виртуальными.

Разница между виртуальным и абстрактным

Хотя Abstract и Virtual являются двумя ключевыми словами / концепциями, которые дают смысл неполной реализации связанных сущностей, они имеют свои различия. Абстрактные методы (которые должны быть определены внутри абстрактных классов) вообще не имеют реализации, в то время как виртуальные методы могут иметь реализацию. Если абстрактные методы расширяются конкретным классом, все унаследованные абстрактные методы должны быть реализованы, в то время как унаследованные виртуальные методы могут быть или не быть переопределены.