Virtueel versus abstract
Virtueel en abstract zijn twee sleutelwoorden die worden gebruikt in de meeste objectgeoriënteerde (OO) programmeertalen, zoals Java en C #. Hoewel er kleine verschillen zijn in wat het betekent in verschillende talen, geven zowel virtuele als abstracte zoekwoorden een gevoel van gedeeltelijke implementatie aan de entiteiten die het aan.
Abstract
Doorgaans kunnen abstracte klassen, ook bekend als abstracte basisklassen (ABC), niet worden geïnstantieerd (een exemplaar van die klasse kan niet worden gemaakt). Dus, abstracte klassen zijn alleen zinvol als de programmeertaal overerving ondersteunt (mogelijkheid om subklassen te maken door een klasse uit te breiden). Abstracte klassen vertegenwoordigen meestal een abstract concept of entiteit met gedeeltelijke of geen implementatie. Daarom werken abstracte klassen als bovenliggende klassen waaruit onderliggende klassen zijn afgeleid, zodat de onderliggende klasse de onvolledige kenmerken van de bovenliggende klasse deelt en functionaliteit kan worden toegevoegd om ze te voltooien. Abstracte klassen kunnen abstracte methoden bevatten. Subklassen die een abstracte klasse uitbreiden, kunnen deze (overgenomen) abstracte methoden implementeren. Als de onderliggende klasse al dergelijke abstracte methoden implementeert, is het een concrete klasse. Maar als dat niet het geval is, wordt de kinderklasse ook een abstracte klasse. Wat dit alles betekent is dat, wanneer de programmeur een klasse nomineert als een Abstract, ze zegt dat de klas onvolledig zal zijn en elementen bevat die moeten worden aangevuld door de overervende subklassen. Dit is een leuke manier om een contract tussen twee programmeurs te maken, wat taken in softwareontwikkeling vereenvoudigt. De programmeur, die de code schrijft om te erven, moet de methodedefinities precies volgen (maar kan natuurlijk een eigen implementatie hebben). In Java en C # worden abstracte klassen en methoden gedeclareerd met Abstract trefwoord.
virtueel
Virtuele methoden / functies bieden de mogelijkheid om optioneel het gedrag van een overervingsklasse te overschrijven (met behulp van een functie met dezelfde handtekening). Het concept van Virtuele functie is belangrijk in het volgende scenario. Stel dat een klasse wordt afgeleid door een onderliggende klasse, dan kan het zijn dat telkens wanneer een object van de afgeleide klasse wordt gebruikt, dit verwijst naar een object van de basisklasse of de afgeleide klasse. Maar methodeaanroepgedrag kan dubbelzinnig zijn als de methoden van de basisklasse worden genegeerd. Dus om deze ambiguïteit te verhelpen, wordt virtueel zoekwoord gebruikt. Als de methode is gemarkeerd als virtueel, wordt de functie van de afgeleide klasse aangeroepen (indien aanwezig) of wordt de functie van de basisklasse aangeroepen. In C ++ wordt bijvoorbeeld Virtueel zoekwoord precies voor dit doel gebruikt. In C # wordt het virtuele sleutelwoord op een vergelijkbare manier gebruikt, maar daarnaast moet de sleutelwoordvervanging worden gebruikt om alle overschreven methoden te wijzigen. Maar in Java is er geen expliciet virtueel zoekwoord. Alle niet-statische methoden worden als virtueel beschouwd. Virtuele functies zonder lichaam worden Pure Virtual-functies genoemd. In Java en C # zijn abstracte methoden in feite puur virtueel.
Verschil tussen virtueel en abstract
Hoewel Abstract en Virtueel twee sleutelwoorden / concepten zijn die een betekenis geven aan onvolledige implementatie van de bijbehorende entiteiten, hebben ze wel hun verschillen. Abstracte methoden (die moeten worden gedefinieerd in abstracte klassen) hebben helemaal geen implementatie, terwijl virtuele methoden mogelijk een implementatie hebben. Als de abstracte methoden worden uitgebreid met een concrete klasse, moeten alle overgenomen abstracte methoden worden geïmplementeerd, terwijl de overgenomen virtuele methoden al dan niet kunnen worden opgeheven.