Programavimas

Naršyti virtualius ir abstrakčius metodus C #

C # programavimo kalba galima palaikyti tiek virtualius, tiek abstrakčius metodus, kurių kiekvienas turi aiškių pranašumų. Norėdami įgyvendinti vėlyvąjį įrišimą, naudojate virtualius metodus, o abstraktūs metodai leidžia priversti tipo poklasius aiškiai nepaisyti metodo. Šiame įraše pateiksiu diskusiją tiek apie virtualius, tiek apie abstrakčius metodus ir apie tai, kada jie turėtų būti naudojami.

Virtualus metodas yra tas, kuris yra deklaruojamas kaip virtualus bazinėje klasėje. Metodas deklaruojamas kaip virtualus, metodo paraše nurodant raktinį žodį „virtualus“. Virtualus metodas gali turėti grąžinimo tipą arba jo neturėti. Virtualūs metodai leidžia tipo poklasiams nepaisyti metodo. Jie naudojami vykdymo laiko polimorfizmui arba vėlyvam rišimui įgyvendinti. Reikėtų pažymėti, kad virtualūs ar abstraktūs klasės nariai negali būti paskelbti privačiais. Be to, galite turėti įgyvendinimą virtualiuoju metodu, t. Y. Virtualiuose metoduose gali būti diegimų. Šiuos diegimus galima nepaisyti tipo, kuriame buvo apibrėžtas virtualus metodas, poklasiai.

MSDN teigia: "Virtualus raktinis žodis naudojamas modifikuoti metodą, ypatybę, indeksavimo priemonę ar įvykių deklaraciją ir leisti jį nepaisyti išvestinėje klasėje."

Dabar įsigilinkime į tam tikrą kodą, kad būtų aiškiau, kaip naudojami virtualūs metodai. Žr. Toliau pateiktą kodo fragmentą.

visuomenės klasės bazė

{

viešas virtualaus tuštumo testas ()

{

Console.WriteLine ("Tai yra pagrindinė virtualaus metodo versija");

}

}

visuomenės klasė Išvestinė: bazė

{

viešas nepaisymas negaliojantis testas ()

{

Console.WriteLine ("Tai išvestinė virtualaus metodo versija");

}

}

Test () metodas yra paskelbtas virtualiu „Base“ klasėje ir yra nepaisomas „Derived“ klasėje. Atkreipkite dėmesį, kaip virtualus raktinis žodis naudojamas deklaruojant metodą kaip virtualų „Base“ klasėje. Virtualiojo raktinio žodžio nereikia, kai nepaisote virtualaus metodo klasėje „Išvestinis“.

Dabar skaitykite toliau pateiktą kodo fragmentą, kuris iliustruoja, kaip vadinami virtualūs metodai.

klasės programa

{

statinis negaliojantis Pagrindinis ()

{

Pagrindo pagrindasObj1 = nauja bazė ();

baseObj1.Test ();

Pagrindo pagrindasObj2 = naujas išvestinis ();

baseObj2.Test ();

}

}

Atkreipkite dėmesį, kad yra sukurti du „Base“ klasės egzemplioriai - „baseObj1“ ir „baseObj2“. Pirmuoju atveju pamatinis objektas, pavadintas baseObj1, nurodo bazės klasės egzempliorių. Antruoju atveju nuorodos objektas, pavadintas baseObj2, nurodo išvestinės klasės egzempliorių. Kai vykdote kodą, pirmą kartą iškvietus virtualų metodą, konsolėje bus rodomas pranešimas „Tai yra pagrindinė virtualaus metodo versija“. Antruoju atveju būtų rodomas pranešimas „Tai yra išvestinė virtualaus metodo versija“. Kodėl šis skirtumas?

Pirmuoju atveju atsižvelgiama į pamatinio objekto tipą baseObj1 - kadangi jis yra „Base“ tipo, bus iškviesta pagrindinė virtualaus metodo versija. Antruoju atveju bus atsižvelgta į referencinio objekto baseObj2 kontekstą, taigi ir rezultatą.

Abstraktūs metodai yra tie, kurie yra paskelbti abstrakčiais pagrindinėje klasėje ir juose negali būti įdiegimų, t. Y. Jie negali turėti jokio funkcionalumo. Galite naudoti abstrakčius metodus, kai norite, kad metodas būtų stipriai pakeistas išvestinėse to tipo klasėse, kuriomis buvo apibrėžtas abstraktus metodas. Tai kompiliatorius vykdo kompiliavimo metu. Taigi, jei jūs paskelbėte metodą abstrakčiu, naudodami abstrakčią modifikatorių bazinėje klasėje, šios klasės poklasiai turėtų įdiegti abstraktų metodą, kurio nepavykus, kompiliatorius parodys klaidą, nurodydamas, kad išvestinė klasė neįgyvendino abstraktaus metodo narys. Iš esmės abstraktus metodas yra deklaruojamas naudojant abstraktų raktinį žodį abstrakčioje bazinėje klasėje, o šio tipo ne abstraktūs poklasiai turi turėti savo abstraktaus metodo įgyvendinimą. Abstraktūs metodai taip pat yra netiesiogiai virtualūs, tačiau deklaruodami abstraktų metodą negalite naudoti virtualaus raktinio žodžio. Pažymėtina, kad abstrakčius metodus galima deklaruoti tik abstrakčių klasių viduje.

Tipiškas abstraktaus metodo naudojimas yra priversti nepaisyti ToString () arba Equals () metodų. Šis kodo fragmentas parodo, kaip abstraktūs metodai yra deklaruojami abstrakčioje klasėje, pavadintoje EntityBase.

viešoji abstrakčioji klasė „EntityBase“

{

viešas abstraktus nepaisyti eilutės ToString ();

public abstract override bool Equals (objektas obj);

}

viešosios klasės klientas: „EntityBase“

{

// Abstrakčių metodų įgyvendinimo kodas

}

„EntityBase“ klasė yra bazinis visų subjektų tipas - kliento subjekto klasė pratęsia šią klasę ir pateikia abstrakčių metodų įgyvendinimą. Iš esmės visos subjektų klasės galėtų patys įgyvendinti „ToString“ () ir „Equals“ () metodus. Nėra numatytojo šių metodų diegimo pagrindinėje klasėje, todėl jie pažymėti kaip abstraktūs. Taigi metodo nepaisymas vykdomas paskelbiant metodą abstrakčiu bazinėje klasėje, pavadintoje EntityBase.

$config[zx-auto] not found$config[zx-overlay] not found