Ohjelmointi

Virtuaalisten ja abstraktien menetelmien tutkiminen C #: ssä

C # -ohjelmointikieli tukee sekä virtuaalisia että abstrakteja menetelmiä, joista jokaisella on omat etunsa. Käytät virtuaalisia menetelmiä myöhäisen sitomisen toteuttamiseksi, kun taas abstraktien menetelmien avulla voit pakottaa tyypin alaluokat menetelmän nimenomaisesti ohittamaan. Tässä viestissä esitän keskustelun sekä virtuaalisista että abstrakteista menetelmistä ja siitä, milloin niitä tulisi käyttää.

Virtuaalinen menetelmä on menetelmä, joka ilmoitetaan virtuaaliseksi perusluokassa. Menetelmä julistetaan virtuaaliseksi määrittämällä avainsana "virtuaalinen" menetelmän allekirjoitukseen. Virtuaalimenetelmällä voi olla palautustyyppi tai ei. Virtuaaliset menetelmät antavat tyypin alaluokkien ohittaa menetelmän. Niitä käytetään ajoaikaisen polymorfismin tai myöhäisen sitoutumisen toteuttamiseen. On huomattava, että luokan virtuaalisia tai abstrakteja jäseniä ei voida julistaa yksityisiksi. Sinulla voi myös olla toteutus virtuaalisessa menetelmässä, ts. Virtuaalisilla menetelmillä voi olla toteutuksia. Nämä toteutukset voidaan ohittaa sen tyypin alaluokilla, jossa virtuaalinen menetelmä on määritelty.

MSDN toteaa: "Virtuaalista avainsanaa käytetään menetelmän, ominaisuuden, indeksoijan tai tapahtuman ilmoituksen muokkaamiseen ja sen ohittamiseen johdetussa luokassa."

Kaivetaan nyt koodiin saadaksemme paremman selityksen virtuaalisten menetelmien käytöstä. Katso alla oleva koodinpätkä.

julkisen luokan tukikohta

{

julkisen virtuaalisen mitätön testi ()

{

Console.WriteLine ("Tämä on virtuaalimenetelmän perusversio");

}

}

julkinen luokka Johdettu: Base

{

public override void Test ()

{

Console.WriteLine ("Tämä on johdettu versio virtuaalisesta menetelmästä");

}

}

Test () -menetelmä julistetaan virtuaaliseksi Base-luokassa ja ohitetaan Derived-luokassa. Huomaa, kuinka virtuaalista avainsanaa käytetään julistamaan menetelmä virtuaaliseksi Base-luokassa. Virtuaalista avainsanaa ei tarvita, kun ohitat virtuaalisen menetelmän Derived-luokassa.

Katso seuraavaksi annettu koodinpätkä, joka kuvaa kuinka virtuaalisia menetelmiä kutsutaan.

luokan ohjelma

{

staattinen void Main ()

{

Base baseObj1 = uusi Base ();

baseObj1.Test ();

PohjapohjaObj2 = uusi johdettu ();

baseObj2.Test ();

}

}

Huomaa, että luodaan kaksi Base-luokan esiintymää - baseObj1 ja baseObj2. Ensimmäisessä tapauksessa viiteobjekti nimeltä baseObj1 viittaa Base-luokan esiintymään. Toisessa tapauksessa viiteobjekti nimeltä baseObj2 viittaa johdetun luokan esiintymään. Kun suoritat koodin, ensimmäinen kutsu virtuaalimenetelmälle näyttää konsolissa sanoman "Tämä on virtuaalimenetelmän perusversio". Toisessa tapauksessa näytetään viesti "Tämä on johdettu versio virtuaalimenetelmästä". Miksi tämä ero?

Ensimmäisessä tapauksessa otetaan huomioon viiteobjektin baseObj1 tyyppi - koska se on Base-tyyppiä, kutsutaan virtuaalimenetelmän perusversio. Toisessa tapauksessa viiteobjektin baseObj2 konteksti otetaan huomioon ja siten tulos.

Abstraktit menetelmät ovat niitä, jotka julistetaan abstrakteiksi perusluokassa, eikä niissä voi olla toteutuksia, ts. Niillä ei voi olla mitään toiminnallisuutta. Voit käyttää abstrakteja menetelmiä, kun haluat, että menetelmä ohitetaan voimakkaasti sen tyyppisissä johdetuissa luokissa, joissa abstrakti menetelmä on määritelty. Kääntäjä pakottaa tämän kääntämisajankohtana. Joten, jos olet julistanut menetelmän abstraktiksi käyttämällä abstraktin modifikaattoria perusluokassa, tämän luokan aliluokkien on toteutettava abstrakti menetelmä, jollei käännös kääntäjä näytä virheen, jonka mukaan johdettu luokka ei ole toteuttanut abstraktia jäsen. Pohjimmiltaan abstrakti menetelmä julistetaan abstraktin avainsanan avulla abstraktissa perusluokassa, ja tämän tyyppisillä ei-abstrakteilla alaluokilla on oltava oma toteutus abstraktille menetelmälle. Abstraktit menetelmät ovat myös implisiittisesti virtuaalisia, mutta et voi käyttää virtuaalista avainsanaa ilmoitettaessa abstraktista menetelmästä. On huomattava, että abstrakteja menetelmiä voidaan julistaa vain abstraktien luokkien sisällä.

Tyypillinen abstraktin menetelmän käyttö on pakottaa ToString () tai Equals () -menetelmien ohittaminen. Seuraava koodinpätkä kuvaa, kuinka abstraktit menetelmät ilmoitetaan abstraktissa luokassa, jonka nimi on EntityBase.

julkinen abstrakti luokka EntityBase

{

julkinen abstrakti ohittaa merkkijonon ToString ();

julkinen abstrakti ohittaa boolin Equals (objekti obj);

}

julkisen luokan asiakas: EntityBase

{

// Abstraktien menetelmien toteutuskoodi

}

EntityBase-luokka on kaikkien entiteettien perustyyppi - Asiakas-entiteettiluokka laajentaa tätä luokkaa ja tarjoaa toteutuksen abstrakteille menetelmille. Pohjimmiltaan kaikki entiteettiluokat antaisivat oman toteutustavansa ToString () ja Equals () -menetelmiin. Perusluokassa ei tarvita näiden menetelmien oletustoteutusta, joten ne on merkitty abstrakteiksi. Joten menetelmän ohittaminen pakotetaan julistamalla menetelmä abstraktiksi EntityBase-nimisessä perusluokassa.

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