Interpretacija 1
V C# sta Abstract in Virtual zmedena, oba povezana z dedovanjem in zahtevata uporabo preglasitve. Poglejmo razlike med obema:
1. Virtualna metoda
virtualna ključna beseda se uporablja za spreminjanje metod v osnovnem razredu. Obstajata dve situaciji, kjer se uporablja virtualno:
Scenarij 1: V osnovnem razredu je definirana virtualna metoda, vendar virtualna metoda ni prepisana v izpeljanem razredu. Pri klicu izpeljanega razreda virtualna metoda uporablja metodo, ki jo določa osnovni razred.
Scenarij 2: V osnovnem razredu je definirana virtualna metoda, nato pa se metoda prepiše z preglasitvijo v izpeljanem razredu. Pri klicu izpeljane instance razreda virtualna metoda uporablja izvedeno metodo prepisovanja.
2. Abstraktna metoda (abstraktna metoda)
Abstraktna ključna beseda se lahko uporablja le v abstraktnih razredih za spreminjanje metod in ni posebne implementacije. Implementacija abstraktnih metod mora biti izvedena z uporabo ključne besede za preglasitev v izpeljanem razredu.
Najpomembnejša razlika med vmesnikom in abstraktnim razredom: abstraktni razred je nepopoln razred, abstrakcija objekta, medtem ko je vmesnik vedenjska norma.
3. Ključne besede
Statična: Ko je metoda deklarirana kot statična, je metoda statična in prevajalnik ohrani implementacijo metode v času prevajanja. To pomeni, da metoda pripada razredu, ne pa nobenemu članu, ne glede na to, ali obstaja instanca razreda ali ne. Tako kot vstopna funkcija Static void Main, ker je statična funkcija, jo lahko pokličemo neposredno.
Virtua: Ko je metoda deklarirana kot virtualna, je to virtualna metoda, dokler ne uporabite spremenljivke ClassName = new ClassName(); Pred deklaracijo instance razreda ta ne obstaja v realnem pomnilniškem prostoru. Ta ključna beseda se zelo pogosto uporablja pri dedovanju razredov za zagotavljanje podpore polimorfizmu za metode razredov.
overrride: označuje prepisovanje Ta razred podeduje iz razreda Shape Virtualno, abstraktno pomeni, da drugim razredom, ki želijo podedovati od njega, sporočiš, da lahko preglasiš to mojo metodo ali lastnost, sicer ni dovoljena. Povzetek: Abstraktna deklaracija metode je metoda, ki jo je treba preglasiti z izpeljanim razredom, ki se uporablja za dedovanje; Lahko jo obravnavamo kot namišljeno metodo brez realizacije; Če razred vsebuje abstraktno metodo, mora biti razred definiran kot abstraktni razred, ne glede na to, ali vsebuje druge splošne metode ali ne; Abstraktni razredi ne morejo imeti substanc.
a) Metoda virtualne modifikacije mora imeti implementacijo metode (tudi če gre le za par oklepajev), metoda abstraktne modifikacije pa ne more imeti implementacije.
b) virtualno je mogoče prepisati s podrazredi, abstraktno pa z podrazredi
c) Če je funkcija v razredu spremenjena z abstaktom, je treba tudi ime razreda spremeniti z abstaktom
d) Abstraktno spremenjeni razredi ne morejo biti ustvarjeni kot primerki.
e) Če je metoda v C# pripravljena prepisati nadrejeni razred v podrazredu, je treba metodo spremeniti z virtualnim v nadrejeni razredu in nadgraditi v podrazredu, da programer po nesreči ne prepiše nadrejene metode nadrejenega razreda v podrazredu.
Opomba: Razredi, spremenjeni z abstraktom, se lahko le podedujejo, ne pa instancirajo.
Interpretacija 2
Za spreminjanje starševskega razreda se uporabljajo tako virtualni kot abstraktni razred, kar omogoča ponovno definiranje otroškega razreda z preglasitvijo definicije starševskega razreda.
Imajo eno skupno lastnost: če se uporabljajo za spreminjanje metod, je treba pred njimi dodati javno oznako, sicer bodo prišle do napak pri prevajanju: virtualne ali abstraktne metode ne morejo biti zasebne. Navsezadnje dodajanje virtualnega ali abstraktnega omogoča redefiniranje podrazreda, zasebni člani pa podrazredu ne morejo dostopati.
A so zelo različni. (virtualno pomeni "virtualno", abstraktno je "abstraktno").
(1) Metoda virtualne modifikacije mora biti implementirana (tudi če doda le par oklepajev), medtem ko metoda abstraktne modifikacije ne sme biti implementirana. Na primer, če metoda virtualne modifikacije ni implementirana:
Napaka: "Test1.fun1()" mora deklarirati telo, ker ni označeno kot abstraktno, zunanjo ali delno
Za abstraktne modifikatorje, če so implementirani:
Napaka: "Test2.fun2()" ne more razglasiti telesa, ker je označeno kot abstraktno
(2) virtualno je mogoče prepisati s podrazredi, medtem ko je abstraktno treba prepisati s podrazredi.
Pri prevajanju ni napake; če je metoda virtualnega modifikatorja prepisana, je treba pred njo dodati override (kar prevajalniku sporoči, da želite prepisati virtualno metodo), in mora obstajati implementacija, sicer bo prevajanje napačno:
(3) Če je član razreda spremenjen z abstraktom, je treba abstrakt dodati pred razredom, saj lahko abstraktne metode uporabljajo le abstraktni razredi.
(4) Primerkov abstraktnih razredov ni mogoče ustvarjati, lahko jih le podedujemo in jih ni mogoče instancirati, na primer: BaseTest2 base2 = novi BaseTest2(); Prišlo bo do napake pri prevajanju: abstraktni razred ali vmesnik ne more ustvariti instance.
(5) V C#, če želite prepisati metodo v podrazredu, morate dodati virtualno pred nadrejeno metodo in preglasiti pred podrazredno metodo, da preprečite, da bi programerji po nesreči prepisali nadrejeno metodo v podrazredu.
(6) Abstraktna metoda mora biti prepisana, virtualna metoda pa mora imeti implementacijo (tudi če je definirana v abstraktnem razredu).
Interpretacija 3 Podobnosti: 1. Vse se lahko dedujejo 2. Nobenega od njih ni mogoče uresničiti 3. Lahko vsebuje deklaracije metod 4. Izpeljani razredi morajo implementirati nerealizirane metode Ločevati: 1. Abstraktni osnovni razredi lahko definirajo polja, atribute in implementacije metod. Vmesniki lahko definirajo le atribute, indeksatorje, dogodke in deklaracije metod ter ne smejo vsebovati polj. 2. Abstraktni razred je nepopoln razred, ki ga je treba še dodatno izpopolniti, medtem ko je vmesnik vedenjska norma. Microsoftovi prilagojeni vmesniki vedno vsebujejo ustrezno polje, ki dokazuje, da so izrazi "Zmorem..." ” 3. Vmesnike je mogoče implementirati večkrat, abstraktne razrede pa lahko podeduje le ena oseba 4. Abstraktni razredi so bolj definirani med nizom tesno povezanih razredov, medtem ko je večina vmesnikov ohlapno povezanih, vendar vsi implementirajo določeno funkcijo 5. Abstraktni razredi so pojmi, abstrahirani iz niza povezanih predmetov, zato odražajo notranjo skupnost stvari; Vmesnik je funkcionalna konvencija, definirana za izpolnjevanje zunanjih klicev, zato odraža zunanje značilnosti stvari 6. Vmesnik v bistvu nima nobenih specifičnih značilnosti dedovanja, obljublja le metodo, ki jo je mogoče imenovati 7. Vmesnik se lahko uporablja za podporo povratnim klicem, vendar dedovanje te funkcije nima 8. Specifične metode, ki jih implementirajo abstraktni razredi, so privzeto virtualne, vendar so metode vmesnika v razredu, ki implementirajo vmesnik, privzeto nevirtualne, seveda jih lahko tudi razglasite za virtualne 9. Če abstraktni razred implementira vmesnik, je mogoče metodo v vmesniku preslikati v abstraktni razred kot abstraktno metodo brez potrebe po implementaciji, vendar je metoda v vmesniku lahko implementirana v podrazredu abstraktnega razreda Pravila uporabe: 1. Abstraktni razredi se večinoma uporabljajo za tesno povezane objekte, medtem ko so vmesniki najboljši za zagotavljanje splošne funkcionalnosti za nepomembne razrede 2. Če želite oblikovati veliko funkcionalno enoto, uporabite abstraktne razrede; Če želite oblikovati majhne, jedrnate funkcionalne bloke, uporabite vmesnike. 3. Če se pričakuje, da bo ustvarjenih več različic komponente, ustvarite abstraktni razred. Ko je vmesnik enkrat ustvarjen, ga ni mogoče spremeniti. Če je potrebna nova različica vmesnika, je treba ustvariti popolnoma nov vmesnik. 4. Če bo ustvarjena funkcija uporabljena med širokim naborom heterogenih objektov, uporabite vmesnik; Če želite zagotoviti skupno implementirano funkcionalnost za vse implementacije komponente, uporabite abstraktne razrede. 5. Analizirati predmet, izpopolniti notranjo skupno točko v abstraktni razred, ki se uporablja za izražanje bistva predmeta, torej "kaj". Vmesniki imajo prednost, kadar je treba razširiti zunanje klice ali funkcije 6. Dobra definicija vmesnika naj bo specifična in funkcionalna, ne večnamenska, sicer bo povzročila onesnaževanje vmesnikov. Če razred implementira le eno funkcijo vmesnika, vendar mora v vmesniku implementirati druge metode, temu pravimo onesnaženje vmesnikov 7. Poskusite se izogniti uporabi dedovanja za dosego funkcije oblikovanja, vendar uporabite multipleksiranje črnih skrinj, torej kombinacijo objektov. Zaradi povečanja števila stopenj dedovanja je najbolj neposredna posledica, da ko pokličeš razred v tem taksonu, jih moraš vse naložiti v sklad! Posledice si lahko predstavljamo. (V kombinaciji z razumevanjem principov sklada). Hkrati lahko zainteresirani prijatelji opazijo, da Microsoft pogosto uporablja metodo kombiniranja objektov pri sestavljanju razreda. Na primer, v asp.net ima razred Page lastnosti, kot je Server Request, vendar so v resnici vsi objekti določenega razreda. Uporaba tega objekta razreda Page za klicanje metod in lastnosti drugih razredov je zelo osnovno načelo načrtovanja Na primer: Okenske oblike je mogoče oblikovati z abstraktnimi razredi, javne operacije in lastnosti pa lahko postavimo v abstraktni razred, tako da lahko obrazec in pogovorno okno podedujeta ta abstraktni razred ter se nato razširita in izboljšata glede na svoje potrebe.
Tiskalna operacija je lahko zagotovljena kot vmesnik za vsak obrazec, ki potrebuje to funkcijo, saj je vsebina obrazca drugačna in morajo sami implementirati svojo tiskarsko funkcijo glede na svoje zahteve. Pri tiskanju se pokliče le prek vmesnika, ne glede na to, katera oblika se tiska.
Skupnost, individualnost in izbira: Nekatere knjige pišejo, da C# priporoča uporabo vmesnikov namesto abstraktnih osnovnih razredov in poudarjajo številne prednosti uporabe vmesnikov, s katerimi se ne upam strinjati; glede na zgornji seznam je še vedno veliko razlik med obema, in obstoj te razlike mora določati razlike v uporabnih scenarijih, na primer abstraktni osnovni razred lahko zagotovi privzete implementacije za nekatere metode, da se prepreči ponavljajoča implementacija v podrazredih in izboljša ponovno uporabnost kode. To je prednost abstraktnih razredov; Vmesnik lahko vsebuje le abstraktne metode. Kar zadeva, kdaj uporabljati abstraktne osnovne razrede in kdaj uporabljati vmesnike, je odvisno od tega, kako uporabniki vidijo povezave med podedovanimi razredi, ali gre za osebnostne razlike ali skupne povezave med njimi. Naj to ponazorim z življenjskim primerom.
Če dobite tri predmete, in sicer ljudi, ribe in žabe, in vas prosijo, da oblikujete osnovno kategorijo, da povzamete povezavo med njimi, potem boste najprej začutili, da so med njimi velike razlike in težko je abstrahirati skupne značilnosti. Tukaj bi morali razmisliti o uporabi vmesnikov namesto abstraktnih osnovnih razredov iz treh razlogov:
1. Individualnost je večja od skupnega. 2. Osebnosti z velikimi razlikami imajo nekatere podobne vedenjske vzorce. 3. Obstajajo velike razlike v metodah realizacije istega vedenja. Takrat dobiš še tri predmete, in sicer križa, krapa in zlato ribico, in še vedno lahko oblikuješ osnovne razrede, ki povzemajo povezavo med njimi, nato pa najprej ugotoviš, da vsi pripadajo ribam, druga pa je, da je način plavanja lahko nekoliko drugačen, zato bi moral namesto vmesnikov uporabljati abstraktne osnovne razrede, v primerjavi z zgornjim primerom so trije razlogi:
1. Skupnost je večja od individualnosti 2. Posamezniki z enako skupno značilnostjo morajo imeti enake lastnosti in vedenja 3. Obstajajo določene razlike v metodah implementacije istega vedenja Med več razlogi za uporabo vmesnikov ali abstraktnih osnovnih razredov je tretji razlog pravzaprav isti, ki opisuje koncept polimorfizma v objektno usmerjenem sistemu, torej je implementiran tako, da se nadpisuje nadrejeni razred in v času izvajanja kliče ustrezna metoda glede na preneseno referenco na objekt. Drugi razlog se začne razhajati, saj vmesniki poudarjajo enako vedenje med podedovanimi objekti, medtem ko abstraktni razredi prav tako poudarjajo enake lastnosti med podedovanimi objekti. Kar resnično loči vmesnike od abstraktnih osnovnih razredov, so naslednji razlogi:
Vmesniki se uporabljajo, kadar iščemo funkcionalno podobnost med objekti z velikimi razlikami. Abstraktni osnovni razredi se uporabljajo, kadar se iščejo funkcionalne razlike med objekti z večjo skupno značilnostjo. S primerjavo enakih in različnih lahko rečemo le, da imajo vmesniki in abstraktni razredi svoje prednosti, vendar prednosti ni. Pri dejanski programerski praksi moramo svoje talente meriti glede na specifično situacijo, vendar vam lahko naslednje izkušnje in kopičenje prinesejo nekaj navdiha; poleg nekaterih mojih izkušenj jih veliko prihaja iz klasik, verjamem, da lahko prestanejo preizkus. Torej pri pravilih in priložnostih, ko se učimo teh klasik, je najpomembnejše, da uporabimo, kar smo se naučili, seveda bom z besedami družine osvojil smeh vseh, prosim, nadaljujte.
Pravila in priložnosti: 1. Ne pozabite, da je eno najpomembnejših načel objektno usmerjenega mišljenja: programiranje usmerjeno na vmesnike. 2. S pomočjo vmesnikov in abstraktnih razredov je bilo veliko idej v 23 oblikovalskih vzorcev pametno implementiranih, in mislim, da je njihova bistvo preprosto v tem, da so usmerjene v abstraktno programiranje. 3. Abstraktne razrede je treba predvsem uporabljati za tesno povezane objekte, medtem ko so vmesniki najboljši za zagotavljanje splošne funkcionalnosti za nepomembne razrede. 4. Vmesnik se osredotoča na tip odnosa CAN-DO, medtem ko se abstraktni razred osredotoča na odnos IS-A. 5. Obnašanje večnamensko definiranih objektov v vmesniku; abstraktni razredi večkratno definirajo lastnosti objektov; 6. Definicije vmesnikov lahko uporabljajo javne, zaščitene, notranje in zasebne modifikatorje, vendar so skoraj vsi vmesniki definirani kot javni, zato ni treba dodajati več. 7. "Vmesnik ostaja nespremenjen" je pomemben dejavnik, ki ga je treba upoštevati. Zato je pri dodajanju razširitev iz vmesnikov treba dodati nove vmesnike, ne obstoječih vmesnikov. 8. Poskusite zasnovati vmesnik v funkcionalni blok z eno funkcijo, kot primer .NET Framework; IDisposable, IDisposable, IComparable, IEquatable, IEnumerable itd. vsebujejo le eno skupno metodo. 9. Velika črka "I" pred imenom vmesnika je konvencija, tako kot se ime polja začne z podčrtavanjem, prosimo, upoštevajte ta načela. 10. V vmesniku so vse metode privzeto na javne. 11. Če pričakujete težave z različicami, lahko ustvarite "abstraktni razred". Na primer, če ustvarite psa, piščanca in raco, bi morali razmisliti o abstrahiranju živali, da bi se spopadli s stvarmi, ki se lahko pojavijo v prihodnosti. Dodajanje novih članov v vmesnik prisili spreminjanje in ponovno prevajanje vseh izpeljanih razredov, zato so problemi verzioniranja najbolje implementirani z abstraktnimi razredi. 12. Neabstraktni razredi, izpeljani iz abstraktnih razredov, morajo vključevati vse podedovane abstraktne metode in dejanske implementacije abstraktnih accessorjev. 13. Nove ključne besede ni mogoče uporabiti za abstraktne razrede, prav tako jih ni mogoče zapečatiti, ker abstraktnih razredov ni mogoče instancirati. 14. Statični ali virtualni modifikatorji se ne smejo uporabljati v abstraktnih deklaracijah metod.
|