Programmēšana

Virtuālu un abstraktu metožu izpēte C #

C # programmēšanas valoda nodrošina atbalstu gan virtuālām, gan abstraktām metodēm, katrai no tām ir atšķirīgas priekšrocības. Jūs izmantojat virtuālās metodes, lai ieviestu novēlotu saistīšanu, savukārt abstraktās metodes ļauj piespiest tipa apakšklases nepārprotami ignorēt metodi. Šajā ierakstā es iepazīstināšu ar diskusiju gan par virtuālajām, gan par abstraktajām metodēm un par to, kad tās jāizmanto.

Virtuālā metode ir tā, kas bāzes klasē tiek pasludināta par virtuālu. Metode tiek pasludināta par virtuālu, metodes parakstā norādot atslēgvārdu "virtuāls". Virtuālajai metodei var būt vai nav atgriešanās veids. Virtuālās metodes ļauj tipa apakšklasēm ignorēt metodi. Tos izmanto, lai ieviestu darbības laika polimorfismu vai novēlotu saistīšanos. Jāatzīmē, ka virtuālus vai abstraktus klases dalībniekus nevar pasludināt par privātiem. Jums var būt arī ieviešana virtuālajā metodē, t.i., virtuālajās metodēs var būt ieviešana. Šīs realizācijas var ignorēt tā tipa apakšklases, kurā definēta virtuālā metode.

MSDN norāda: "Virtuālo atslēgvārdu izmanto, lai modificētu metodi, rekvizītu, indeksētāju vai notikumu deklarāciju un ļautu to ignorēt atvasinātajā klasē."

Tagad iegremdēsimies kādā kodā, lai iegūtu skaidrību par to, kā tiek izmantotas virtuālās metodes. Skatiet tālāk redzamo koda fragmentu.

sabiedrības klases bāze

{

publiskā virtuālā tukšuma pārbaude ()

{

Console.WriteLine ("Šī ir virtuālās metodes bāzes versija");

}

}

sabiedrības klase Atvasināts: Bāze

{

publiski ignorēt anulēto testu ()

{

Console.WriteLine ("Šī ir virtuālās metodes atvasinātā versija");

}

}

Test () metode tiek pasludināta par virtuālu bāzes klasē un tiek ignorēta klasē Derived. Ievērojiet, kā virtuālo atslēgvārdu izmanto, lai metodi klasē deklarētu par virtuālu. Virtuālais atslēgvārds nav nepieciešams, ja ignorējat klasē Derived virtuālo metodi.

Tagad skatiet tālāk sniegto koda fragmentu, kas ilustrē virtuālo metožu izsaukšanu.

klases programma

{

static void Main ()

{

Bāzes bāzeObj1 = jauna Bāze ();

baseObj1.Test ();

Bāzes bāzeObj2 = jauns Atvasināts ();

baseObj2.Test ();

}

}

Ņemiet vērā, ka tiek izveidoti divi bāzes klases gadījumi - baseObj1 un baseObj2. Pirmajā gadījumā atsauces objekts ar nosaukumu baseObj1 attiecas uz bāzes klases gadījumu. Otrajā gadījumā atsauces objekts ar nosaukumu baseObj2 attiecas uz atvasinātās klases gadījumu. Izpildot kodu, pirmais zvans uz virtuālo metodi konsolē parādīs ziņojumu "Šī ir virtuālās metodes pamata versija". Otrajā gadījumā tiktu parādīts ziņojums "Šī ir virtuālās metodes atvasinātā versija". Kāpēc šī atšķirība?

Pirmajā gadījumā tiek ņemts vērā atsauces objekta tips baseObj1 - tā kā tas ir bāzes tipa, tiks izsaukta virtuālās metodes bāzes versija. Otrajā gadījumā tiks ņemts vērā atsauces objekta baseObj2 konteksts un līdz ar to arī rezultāts.

Abstraktās metodes ir tās, kuras bāzes klasē tiek pasludinātas par abstraktām un kurās nevar būt ieviešanas, t.i., tām nevar būt nekādas funkcionalitātes. Abstraktās metodes varat izmantot, ja vēlaties, lai metode tiktu stingri ignorēta atvasinātajās klasēs, kurās definēta abstraktā metode. Kompilators to izpilda kompilēšanas laikā. Tātad, ja esat deklarējis metodi kā abstraktu, izmantojot abstrakto modifikatoru bāzes klasē, šīs klases apakšklasēm būtu jāievieš abstraktā metode, pretējā gadījumā sastādītājs parādīs kļūdu, norādot, ka atvasinātā klase nav ieviesusi abstrakciju biedrs. Būtībā abstraktā metode tiek deklarēta, izmantojot abstraktu atslēgas vārdu abstraktā pamatklasē, un šāda veida ne-abstraktajām apakšklasēm ir jābūt savai abstraktās metodes ieviešanai. Abstraktām metodēm ir arī netieši virtuāls raksturs, taču, deklarējot abstraktu metodi, jūs nevarat izmantot virtuālo atslēgvārdu. Jāatzīmē, ka abstraktas metodes var deklarēt tikai abstraktu klašu iekšienē.

Tipisks abstraktas metodes pielietojums ir piespiedu kārtā ignorēt ToString () vai Equals () metodes. Šis koda fragments parāda, kā abstraktās metodes tiek deklarētas abstraktā klasē ar nosaukumu EntityBase.

publiskā abstraktā klase EntityBase

{

publisks abstrakts ignorēt virkni ToString ();

publisks abstrakts ignorēt bool Vienāds (obj obj);

}

publiskās klases klients: EntityBase

{

// Abstrakto metožu ieviešanas kods

}

EntityBase klase ir pamata veids visām entītijām - Klienta entītijas klase paplašina šo klasi un nodrošina abstrakto metožu ieviešanu. Būtībā visas entītiju klases nodrošinātu pašu ToString () un Equals () metožu ieviešanu. Bāzes klasē nav nepieciešama šo metožu noklusējuma ieviešana, tāpēc tās ir atzīmētas kā abstraktas. Tātad metodes ignorēšana tiek ieviesta, deklarējot metodi kā abstraktu bāzes klasē ar nosaukumu EntityBase.

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