C # - erinevus abstraktse, virtuaalse ja alistamise vahel

c #

Täna tahaksin teile näidata erinevust abstraktse, virtuaalse ja alistamise vahel C # -s.

Abstraktne

Kui lisada funktsioonile või klassile abstraktne, tähendab see, et see pole tõeline ja ootab tuletatud klassi rakendamist. Loome abstraktse klassi Animal:

avalik abstraktse klassi loom
{
       avalik tühi koor ()
       {
            Console.WriteLine (“Loomade koor”);
       }
 }

Proovime luua loomaklassi eksemplari.

Loomloom = uus loom ();

Käivitame selle ja kompilaator tagastab teile vea, öeldes, et te ei saa abstraktse klassi eksemplari luua

Abstraktset klassi ei saa kiirendada

Loome klassi, mis pärib Animali.

avaliku klassi koer: loom
{
   avalik tühi koor ()
   {
      Console.WriteLine (“Koera koor”);
   }
}

Nüüd saame luua objekti Koer loomisel looma esinemisjuhu. Muidugi saame luua ka koeratüübiga Koer.

Loomloom = uus koer ();
Koerakoer = uus koer ();

Tavaliselt sooviksite kasutada esimest rida, sest kui loote üha rohkem loomi pärivaid klasse, on need kõik endiselt Looma tüüpi ja neid saab edasi anda Loomi tüübi parameetriga või kogumiga Looma tüüp. Seda nimetatakse polümorfismiks.

Mis juhtub funktsioonikooril? Muutuva looma puhul, kuna selle tüüp on loom, nimetatakse loomaklassis määratletud koorifunktsiooni. Muutuva koera puhul, kuna selle tüüp on Koer, kutsutakse koerte klassis määratletud koorifunktsiooni.

Kui lisate funktsioonidele abstrakti, ei saa te funktsiooni selles klassis rakendada ja peate selle rakendama tuletatud klassis. Muutkem loomaklass ja koeraklass järgmisteks:

avalik abstraktse klassi loom
{
     avalik abstraktne tühine koor ()
     {
          Console.WriteLine (“Loomade koor”);
     }
}
avaliku klassi koer: loom
{
      avalik tühi koor ()
      {
           Console.WriteLine (“Koera koor”);
      }
}

Käivitamisel on kompileerimisvead tagastatud.

Abstraktset funktsiooni ei saa rakendada

Järgigem siis koostaja juhiseid. Eemaldage koore rakendamine loomaklassis ja käivitage. Mida? Kompileerimisviga tagastatakse !! ??

Üle kirjutada

Jah. Siit tuleb teine ​​võtmesõna - alistada. Koorifunktsiooni rakendamiseks koeraklassis Loomade klassis peate lisama koorefunktsioonile alistuse, et öelda kompilaatorile, et rakendate koort Loomade klassis, selle asemel, et lisada koeraklassis veel üks koorifunktsioon (nagu see, mida oleme varem teinud). Pärast muutmist on kompileerimine edukas ja nüüd näete, et mõlemad read on “Koera koor”.

Virtuaalne

Räägime virtuaalsest. Funktsioonile virtuaalse lisamisega pakute funktsioonile ühist loogikat, kuid võimaldate põhifunktsiooni alistada. Võite öelda, et see on praktiliselt sama asi, kui funktsiooni virtuaalset ei lisata. Ei see ei ole. Näitan teile nüüd erinevust virtuaalse ja mitte-virtuaalse funktsiooni vahel. Muutame loomade ja koerte klasse ning põhifunktsiooni:

avaliku klassi programm
{
    static void Main (string [] args)
    {
        Loomloom = uus koer ();
        Koerakoer = uus koer ();
        loom.koor ();
        koer.bark ();
        loom.eat ();
        koer.eat ();
        Console.ReadLine ();
    }
}
avaliku klassi loom
{
    avalik virtuaalne tühine koor ()
    {
        Console.WriteLine (“Loomade koor”);
    }
    avalik tühine söömine ()
    {
        Console.WriteLine (“Animal Eat”);
    }
}
avaliku klassi koer: loom
{
    avalik ülimuslik tühi koor ()
    {
        Console.WriteLine (“Koera koor”);
    }
    avalik tühine söömine ()
    {
        Console.WriteLine (“Koer sööb”);
    }
}

Ja tulemus on järgmine:

Kui ületate põhiklassi virtuaalse funktsiooni, on mõlemad põhi- ja tuletatud klassi funktsioonid samad. Ilma virtuaalse ja alistamata on teil kaks erinevat funktsiooni - Animal.bark ja Dog.bark.

Teeme veel ühe katse. Põhifunktsiooni järgmise 2 rea lisamine:

Loomne loom2 = uus loom ();
loom2.bark ();

Nüüd, kui seda käivitate, saate loogika, mis on määratletud Loomade klassis. Võtame siis kokku need 3 deklaratsiooni kombinatsiooni ja tulemused:

Loomne loom = uus koer (); animal.bark (); // Väljund: koerahauk
Koerakoer = uus koer (); koer.bark (); // Väljund: koerahauk
Loomne loom2 = uus loom (); loom2.bark (); // Väljund: loomakoor

Kokkuvõte:

Kui tegemist on abstraktsega, siis klassis kasutamist te ei saa selle klassi eksemplari luua. Saate luua lasteklassi eksemplari, mis selle pärib, või luua lasteklassi eksemplari põhiklassi tüübiga. Funktsiooni sisselülitamisel ei saa te funktsiooni põhiklassis rakendada ja see peab olema lasteklassi jaoks ülimuslik.

Virtuaalse jaoks saate selle funktsiooni rakendada põhiklassis. Kui lasteklass selle alistab, on sellest funktsioonist ainult üks versioon.

Üleskirjutamiseks saab ülekirjutust rakendada ainult ületamise, virtuaalse või abstraktse korral.

Nii see on tänaseks. Loodan, et teile meeldivad artikkel ja teil on head päeva

Algselt avaldati see aadressil timmydinheing.com 18. aprillil 2018.