Skirtumas tarp virtualios ir abstrakčios

„Virtual vs Abstract“

„Virtualusis“ ir „Anotacija“ yra du raktiniai žodžiai, naudojami daugumoje objektinių orientacijų (OO) programavimo kalbų, tokių kaip „Java“ ir „C #“. Nors yra nežymių skirtumų, ką tai reiškia skirtingomis kalbomis, tiek virtualūs, tiek abstraktūs raktiniai žodžiai suteikia dalinio įgyvendinimo pojūtį subjektams, kuriems jis priskiriamas.

Anotacija

Paprastai abstrakčiosios klasės, taip pat žinomos kaip „Abstract Base Classes“ (ABC), negali būti realizuotos (tos klasės egzemplioriaus sukurti negalima). Taigi abstrakčiosios klasės turi prasmę tik tuo atveju, jei programavimo kalba palaiko paveldėjimą (galimybė kurti poklasius pratęsiant klasę). Abstrakčios klasės paprastai reiškia abstrakčią sąvoką ar subjektą, iš dalies arba visai neįdiegtus. Todėl abstrakčiosios klasės veikia kaip tėvų klasės, iš kurių išvedamos vaikų klasės, kad vaikų klasė pasidalintų neišsamiomis tėvų klasės ypatybėmis, ir, norint jas papildyti, gali būti pridedamos funkcijos. Abstrakčių klasėse gali būti abstrakčių metodų. Poklasiai, praplečiantys abstrakčią klasę, gali įgyvendinti šiuos (paveldėtus) abstrakčių metodus. Jei vaikų klasė įgyvendina visus tokius abstrakčius metodus, tai yra konkreti klasė. Bet jei taip nėra, vaikų klasė taip pat tampa abstrakčia klase. Visa tai reiškia, kad kai programuotojas paskiria klasę kaip santrauką, ji sako, kad klasė bus neišsami ir joje bus elementų, kuriuos turi užpildyti paveldintys poklasiai. Tai puikus būdas sudaryti sutartį tarp dviejų programuotojų, o tai supaprastina programinės įrangos kūrimo užduotis. Programuotojui, rašančiam kodą paveldėti, reikia tiksliai laikytis metodo apibrėžimų (bet, žinoma, jis gali turėti savo įgyvendinimą). „Java“ ir „C #“ santraukų klasės ir metodai deklaruojami naudojant „Abstract“ raktinį žodį.

Virtualus

Virtualūs metodai / funkcijos suteikia galimybę pasirinktinai nepaisyti jos elgesio paveldėtoje klasėje (naudojant funkciją tuo pačiu parašu). Virtualios funkcijos sąvoka yra svarbi šiame scenarijuje. Tarkime, kad klasę išveda vaikų klasė, tada, kai naudojamas išvestinės klasės objektas, ji gali reikšti bazinės klasės objektą arba išvestinės klasės objektą. Tačiau metodo iškvietimo elgesys gali būti dviprasmiškas, jei nepaisoma bazinės klasės metodų. Taigi, norint išspręsti šią dviprasmybę, naudojamas virtualus raktinis žodis. Jei metodas yra pažymėtas kaip virtualus, vadinama išvestinės klasės funkcija (jei tokia yra) arba pagrindinės klasės funkcija. Pvz., C ++ programoje virtualus raktinis žodis naudojamas būtent šiam tikslui. C # atveju virtualus raktinis žodis naudojamas panašiai, tačiau, be to, raktinio žodžio nepaisymas turėtų būti naudojamas modifikuoti visus nepaisomus metodus. Tačiau „Java“ nėra aiškių virtualių raktinių žodžių. Visi nestatiniai metodai laikomi virtualiaisiais. Virtualios funkcijos be kūno yra vadinamos grynosiomis virtualiomis funkcijomis. „Java“ ir „C #“, abstraktūs metodai iš tikrųjų yra gryni virtualūs.

Skirtumas tarp virtualios ir abstraktos

Nors abstraktus ir virtualus yra du raktiniai žodžiai / sąvokos, suteikiantys supratimą apie asocijuotus subjektus neišsamų įgyvendinimą, jie turi skirtumų. Anotaciniai metodai (kurie turi būti apibrėžti abstrakčių klasių viduje) iš viso nėra įgyvendinami, o virtualūs metodai gali būti įgyvendinami. Jei Santraukos metodai pratęsiami konkrečia klase, turi būti įdiegti visi paveldėti Santraukos metodai, o paveldėti virtualūs metodai gali būti nepaisomi..