Virtueel teenoor Abstrakt
Virtueel en Abstrakt is twee sleutelwoorde wat in die meeste objekgeoriënteerde (OO) programmeertale soos Java en C gebruik word. Alhoewel daar geringe verskille is in wat dit in verskillende tale beteken, verskaf beide virtuele en abstrakte sleutelwoorde 'n gevoel van gedeeltelike implementering aan die entiteite waaraan dit heg.
Abstract
Abstrakte klasse, ook bekend as Abstrakte Basisklasse (ABC), kan gewoonlik nie geïnstansieer word nie ('n instansie van daardie klas kan nie geskep word nie). Dus, Abstrakte klasse is slegs betekenisvol om te hê as die programmeertaal oorerwing ondersteun (vermoë om subklasse te skep deur 'n klas uit te brei). Abstrakte klasse verteenwoordig gewoonlik 'n abstrakte konsep of entiteit met gedeeltelike of geen implementering. Daarom tree Abstrakte klasse op as ouerklasse waaruit kinderklasse afgelei word, sodat die kinderklas die onvolledige kenmerke van die ouerklas sal deel en funksionaliteit bygevoeg kan word om dit te voltooi. Abstrakte klasse kan Abstrakte metodes bevat. Subklasse wat 'n abstrakte klas uitbrei, kan hierdie (oorgeërfde) abstrakte metodes implementeer. As die kinderklas al sulke Abstrakte metodes implementeer, is dit 'n konkrete klas. Maar as dit nie die geval is nie, word die kinderklas ook 'n Abstrakte klas. Wat dit alles beteken, is dat wanneer die programmeerder 'n klas as 'n opsomming nomineer, sy sê dat die klas onvolledig sal wees en dat dit elemente sal hê wat deur die oorerflike subklasse voltooi moet word. Dit is 'n goeie manier om 'n kontrak tussen twee programmeerders te skep, wat take in sagteware-ontwikkeling vergemaklik. Die programmeerder, wat kode skryf om te erf, moet die metodedefinisies presies volg (maar kan natuurlik haar eie implementering hê). In Java en C word Abstrakte klasse en metodes verklaar deur gebruik te maak van Abstrakte sleutelwoord.
Virtueel
Virtuele metodes/funksies bied die vermoë om sy gedrag opsioneel deur 'n erfklas te ignoreer (met 'n funksie met dieselfde handtekening). Die konsep van virtuele funksie is belangrik in die volgende scenario. Gestel 'n klas word deur 'n kinderklas afgelei, wanneer 'n voorwerp van die afgeleide klas dan gebruik word, kan dit verwys na 'n voorwerp van die basisklas of die afgeleide klas. Maar metode-oproepgedrag kan dubbelsinnig wees as die basisklasmetodes oorheers word. Dus, om hierdie dubbelsinnigheid op te los, word virtuele sleutelwoord gebruik. As die metode virtueel gemerk is, word die afgeleide klas se funksie genoem (indien enige) of anders word die basisklas se funksie genoem. Byvoorbeeld, in C++ word virtuele sleutelwoord presies vir hierdie doel gebruik. In C word die Virtuele sleutelwoord op 'n soortgelyke manier gebruik, maar daarbenewens moet die sleutelwoordverwydering gebruik word om alle oorgeskryfde metodes te wysig. Maar in Java is daar geen eksplisiete virtuele sleutelwoord nie. Alle nie-statiese metodes word as Virtueel beskou. Virtuele funksies sonder liggaam word Pure Virtual-funksies genoem. In Java en C is abstrakte metodes in werklikheid Pure Virtual.
Verskil tussen virtueel en abstrak
Alhoewel Abstrak en Virtueel twee sleutelwoorde/konsepte is wat 'n betekenis van onvolledige implementering aan sy geassosieerde entiteite verskaf, het dit tog hul verskille. Abstrakte metodes (wat binne Abstrakte klasse gedefinieer moet word) het glad nie 'n implementering nie, terwyl virtuele metodes 'n implementering kan hê. As Abstrakte metodes met 'n konkrete klas uitgebrei word, moet alle oorgeërfde Abstrakte metodes geïmplementeer word, terwyl geërfde virtuele metodes oorskryf mag word of nie mag nie.