Programavimas

Kaip įgyvendinti polimorfizmą C #

Polimorfizmas reiškia galimybę pateikti tą pačią sąsają skirtingoms formoms. Nors polimorfizmo samprata visose ją palaikančiose programavimo kalbose yra ta pati, tačiau jos įgyvendinimas skirtingose ​​kalbose skiriasi.

Trys polimorfizmo tipai yra perkrova, parametriniai parametrai ir įtraukimas. Polimorfizmas padeda skatinti dizaino lankstumą, leidžiant tą patį metodą įgyvendinti skirtingai. Iš esmės, jūs galite panaudoti polimorfizmą, kad atskirtumėte sąsają nuo įgyvendinimo. Tai skatina pakartotinį kodo naudojimą ir problemų atskyrimą jūsų programoje.

Perkrautas polimorfizmas yra tipas, egzistuojantis klasėse, kurios yra nepriklausomos viena nuo kitos - jos niekaip nėra susijusios (paveldėjimas, priklausomybė ir kt.). Pavyzdžiui, galite turėti dvi skirtingas klases, kurios niekaip nėra susijusios tarpusavyje ir turi metodą tuo pačiu pavadinimu. Operatoriaus perkrova yra šio tipo polimorfizmo pavyzdys.

Parametrinis polimorfizmas arba šablonų polimorfizmas yra tipas, kai klasėje turite daugiau nei vieną metodą su vienodais pavadinimais, bet skirtingais parametrais, t. Y. Visi jie turi tuos pačius metodų pavadinimus, tačiau jie skiriasi parametrais.

Įtraukimo polimorfizmas taip pat žinomas kaip apibrėžimas iš naujo arba svarbesnis metodas. Šio tipo polimorfizmu pogrupis gali iš naujo apibrėžti bazinės klasės metodą. Šis gebėjimas taip pat žinomas kaip specializacija.

Parametrinis polimorfizmas

Tai reiškia polimorfizmo formą, kai savo klasėje turite daugiau nei vieną metodą, kuris turi tą patį pavadinimą, tačiau jie skiriasi savo metodų parašais. Metodo parašas apima metodo grąžinimo tipą, metodo parametrų tipą ir šių parametrų seką. Taigi metodas, priimantis sveiką ir simbolį kaip argumentą, parašu skiriasi nuo kito metodo, kuris priima simbolį ir sveikąjį skaičių kaip argumentus, nors abiejų šių metodų grąžinimo tipai (turintys identiškus metodų pavadinimus) yra vienodi. Kompiliatorius nustato tikslų iškviestiną metodą, palygindamas perkrautų metodų parašus.

Šis kodų sąrašas parodo, kaip galima įgyvendinti metodo perkrovą.

public enum Rimtumas

    {

Informacinis, įspėjamasis, kritinis

    }

viešosios klasės „Logger“

    {

public void žurnalas (eilutės pranešimas)

        {

// Kažkas kodas

        }

public void žurnalas (eilutės pranešimas, sunkumo sunkumas)

        {

// Kažkas kodas

        }

    }

Žr. Aukščiau pateiktą kodų sąrašą. Atkreipkite dėmesį, kaip „Log ()“ metodas buvo perkrautas. Tai yra kompiliavimo laiko polimorfizmo pavyzdys.

Įtraukimo polimorfizmas

Įtraukimo polimorfizmą arba svarbesnį metodą galima pasiekti naudojant C # naudojant virtualius metodus. Nepaisydami metodo, turite metodus, turinčius identiškus parašus tiek pagrindinėje, tiek išvestinėse klasėse. Paprastai norėtumėte naudoti virtualius metodus, kad įgyvendintumėte vykdymo laiko polimorfizmą ar vėlavimą. Atkreipkite dėmesį, kad virtualus metodas yra toks, kuris yra deklaruojamas kaip virtualus bazinėje klasėje, ir jūs galite leisti tipo poklasiams nepaisyti virtualių metodų.

Šiame kodo fragmente rodomos dvi klasės - pagrindinė klasė, pavadinta „Logger“, kurioje yra virtualus metodas, vadinamas „Log“, ir išvestinė klasė, pavadinta „FileLogger“, kuri pratęsia „Logger“ klasę ir nepaiso pagrindinės klasės žurnalo metodo.

viešosios klasės „Logger“

    {

viešas virtualus niekinis žurnalas (eilutės pranešimas)

        {

„Console.WriteLine“ („Bazinės klasės„ Logger “žurnalo metodas“);

        }

    }

viešosios klasės „FileLogger: Logger“

    {

public override void Log (eilutės pranešimas)

        {

Console.WriteLine („Klasės„ FileLogger “žurnalo metodas“);

        }

    }

Tai metodo viršijimo pavyzdys. Ir bazinės, ir išvestinės klasės turi tą patį metodą su identiškais parašais. Mes naudojame metodo viršijimą, kad įgyvendintume vykdymo laiko polimorfizmą ar vėlyvą rišimąsi. Šis kodo fragmentas parodo, kaip galima iškviesti žurnalo metodą naudojant bazinės klasės nuorodą.

static void Main (string [] args)

        {

Logger logger = naujas „FileLogger“ ();

logger.Log („Sveikas pasaulis!“);

Pultas.ReadKey ();

        }

Kai vykdote pirmiau nurodytą kodo fragmentą, bus naudojamas išvestinės klasės „Log“ metodas, t. Y. „Filelogger“ klasė. Jei „Log“ metodas nebuvo deklaruotas kaip virtualus bazinėje klasėje, vietoj jo būtų iškviesta pagrindinė „Log“ metodo versija. Kadangi šis prisijungimas įvyksta vėlai vykdymo metu, tokio tipo polimorfizmas yra žinomas kaip vykdymo laiko polimorfizmas arba vėlyvas prisijungimas.

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