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 trefwoorden een gevoel van gedeeltelijke implementatie aan de entiteiten waaraan het is gekoppeld.
Abstract
Meestal kunnen abstracte klassen, ook wel abstracte basisklassen (ABC) genoemd, niet worden geïnstantieerd (er kan geen instantie van die klasse worden gemaakt). Abstracte klassen hebben dus alleen zin 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 fungeren abstracte klassen als bovenliggende klassen waarvan de onderliggende klassen zijn afgeleid, zodat de onderliggende klasse de onvolledige functies 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 (overgeërfde) abstracte methoden implementeren. Als de onderliggende klasse al dergelijke abstracte methoden implementeert, is het een concrete klasse. Maar als dat niet het geval is,de kinderklasse wordt ook een abstracte klas. Dit alles betekent dat wanneer de programmeur een klas nomineert als een abstract, ze zegt dat de klas onvolledig zal zijn en dat het elementen zal bevatten die moeten worden aangevuld door de overervende subklassen. Dit is een leuke manier om een contract tussen twee programmeurs te creëren, wat taken in softwareontwikkeling vereenvoudigt. De programmeur, die code schrijft om te erven, moet de methodedefinities exact volgen (maar kan natuurlijk haar eigen implementatie hebben). In Java en C # worden abstracte klassen en methoden gedeclareerd met behulp van het abstracte trefwoord. Dit is een leuke manier om een contract tussen twee programmeurs te creëren, wat taken in softwareontwikkeling vereenvoudigt. De programmeur, die code schrijft om te erven, moet de methodedefinities exact volgen (maar kan natuurlijk haar eigen implementatie hebben). In Java en C # worden abstracte klassen en methoden gedeclareerd met behulp van het abstracte trefwoord. Dit is een leuke manier om een contract tussen twee programmeurs te creëren, wat taken in softwareontwikkeling vereenvoudigt. De programmeur, die code schrijft om te erven, moet de methodedefinities exact volgen (maar kan natuurlijk haar eigen implementatie hebben). In Java en C # worden abstracte klassen en methoden gedeclareerd met behulp van het abstracte trefwoord.
Virtueel
Virtuele methoden / functies bieden de mogelijkheid om het gedrag ervan optioneel te overschrijven door een overervende klasse (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, telkens wanneer een object van de afgeleide klasse wordt gebruikt, verwijzen naar een object van de basisklasse of de afgeleide klasse. Maar het gedrag van methodeaanroepen kan dubbelzinnig zijn als de methoden van de basisklasse worden overschreven. Om deze dubbelzinnigheid op te lossen, wordt dus een virtueel trefwoord 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 het virtuele sleutelwoord precies voor dit doel gebruikt. In C # wordt het virtuele trefwoord op een vergelijkbare manier gebruikt, maar daarnaasthet trefwoord moet worden gebruikt om alle overschreven methoden te wijzigen. Maar in Java is er geen expliciet virtueel trefwoord. Alle niet-statische methoden worden als virtueel beschouwd. Virtuele functies zonder body worden Pure Virtual-functies genoemd. In Java en C # zijn abstracte methoden in feite Pure Virtual.
Verschil tussen virtueel en abstract
Hoewel Abstract en Virtual twee sleutelwoorden / concepten zijn die een betekenis geven aan een onvolledige implementatie aan de bijbehorende entiteiten, hebben ze hun verschillen. Abstracte methoden (die moeten worden gedefinieerd in abstracte klassen) hebben helemaal geen implementatie, terwijl virtuele methoden mogelijk een implementatie hebben. Als abstracte methoden worden uitgebreid door een concrete klasse, moeten alle overgeërfde abstracte methoden worden geïmplementeerd, terwijl overgeërfde virtuele methoden al dan niet kunnen worden overschreven.