Virtuel vs abstrakt
Virtuel og abstrakt er to nøgleord, der bruges i de fleste Objektorienterede (OO) programmeringssprog som Java og C #. Selvom der er små forskelle i, hvad det betyder på forskellige sprog, giver både virtuelle og abstrakte nøgleord en følelse af delvis implementering af de enheder, den knytter sig til.
Abstrakt
Typisk kan abstrakte klasser, også kendt som abstrakte baseklasser (ABC), ikke instantieres (et eksempel på denne klasse kan ikke oprettes). Så abstrakte klasser er kun meningsfulde at have, hvis programmeringssprog understøtter arv (evne til at oprette underklasser fra at udvide en klasse). Abstrakte klasser repræsenterer normalt et abstrakt koncept eller enhed med delvis eller ingen implementering. Derfor fungerer abstrakte klasser som forældreklasser, hvorfra børneklasser er afledt, så børneklassen vil dele de ufuldstændige funktioner i forældreklassen, og funktionalitet kan tilføjes for at afslutte dem. Abstrakte klasser kan indeholde abstrakte metoder. Underklasser, der udvider en abstrakt klasse, kan implementere disse (arvelige) abstrakte metoder. Hvis barneklassen implementerer alle sådanne abstrakte metoder, er det en konkret klasse. Men hvis det ikke gør det, bliver barneklassen også en abstrakt klasse. Hvad alt dette betyder, er, at når programmøren nominerer en klasse som et abstrakt, siger hun, at klassen vil være ufuldstændig, og den vil have elementer, der skal udfyldes af de arvelige underklasser. Dette er en dejlig måde at oprette en kontrakt på mellem to programmerere, der forenkler opgaver inden for softwareudvikling. Programmereren, der skriver kode for at arve, skal følge metodedefinitionerne nøjagtigt (men kan selvfølgelig have sin egen implementering). I Java og C # erklæres abstrakte klasser og metoder ved hjælp af abstrakt søgeord.
Virtual
Virtuelle metoder / funktioner giver mulighed for valgfrit at tilsidesætte dens opførsel af en arveløs klasse (ved hjælp af en funktion med den samme signatur). Begrebet Virtuel funktion er vigtigt i det følgende scenarie. Antag, at en klasse er afledt af en barneklasse, så når et objekt fra den afledte klasse bruges, kan den muligvis henvise til et objekt i baseklassen eller den afledte klasse. Men metodeopkaldsadfærd kan være tvetydig, hvis baseklasse-metoder tilsidesættes. Så for at løse denne uklarhed bruges Virtuel nøgleord. Hvis metoden er markeret Virtuel, kaldes den afledte klasses funktion (hvis nogen), ellers kaldes basisklassens funktion. I C ++ bruges virtuelt nøgleord nøjagtigt til dette formål. I C # bruges det virtuelle nøgleord på en lignende måde, men derudover skal nøgleordets tilsidesættelse bruges til at ændre alle tilsidesatte metoder. Men i Java er der ikke et eksplicit Virtuelt nøgleord. Alle ikke-statiske metoder betragtes som virtuelle. Virtuelle funktioner uden krop kaldes Pure Virtual-funktioner. I Java og C # er abstrakte metoder faktisk rene virtuelle.
Forskellen mellem virtuel og abstrakt
Selvom Abstract og Virtual er to nøgleord / koncepter, der giver en betydning af ufuldstændig implementering af dets tilknyttede enheder, har de deres forskelle. Abstrakte metoder (der skal defineres i abstrakte klasser) har overhovedet ikke en implementering, mens virtuelle metoder kan have en implementering. Hvis abstrakte metoder udvides med en konkret klasse, skal alle arvede abstrakte metoder implementeres, mens arvelige virtuelle metoder måske ikke kan tilsidesættes.