See artikkel on masintõlke peegelartikkel, palun klõpsake siia, et hüpata algse artikli juurde.

Vaade: 18805|Vastuse: 0

[Kommunikatsioon] Virtuaalse ja (abstraktse) abstrakti ja liidese sarnasused ja erinevused C#-is...

[Kopeeri link]
Postitatud 22.04.2019 14:41:09 | | |
Tõlgendus 1

C#-s on abstraktne ja virtuaalne segased, mõlemad seotud pärilikkusega ja sisaldavad ülekirjutuse kasutamist. Arutleme nende kahe erinevuste üle:

1. Virtuaalne meetod

virtuaalset märksõna kasutatakse baasklassi meetodite muutmiseks. On kaks olukorda, kus kasutatakse virtuaalset:

Stsenaarium 1: Virtuaalne meetod on defineeritud baasklassis, kuid virtuaalset meetodit tuletatud klassis ümber ei kirjutata. Tuletatud klassi eksemplari kutses kasutab virtuaalmeetod baasklassi poolt määratud meetodit.

Stsenaarium 2: Baasklassis defineeritakse virtuaalne meetod ja seejärel kirjutatakse meetod ümber, kasutades tuletatud klassis ülekirjutust. Tuletatud klassi eksemplari kutsumisel kasutab virtuaalne meetod tuletatud ümberkirjutamismeetodit.

2. Abstraktne meetod (abstraktne meetod)

Abstraktset märksõna saab kasutada ainult abstraktsetes klassides meetodite muutmiseks ning konkreetset rakendust ei ole. Abstraktsete meetodite rakendamine tuleb rakendada tuletatud klassi ülekirjutuse märksõnaga.

Kõige olulisem erinevus liidese ja abstraktse klassi vahel: abstraktne klass on mittetäielik klass, objekti abstraktsioon, samas kui liides on käitumuslik norm.


3. Märksõnad

Staatiline: Kui meetod kuulutatakse staatiliseks, on meetod staatiline meetod ja kompilaator hoiab meetodi rakendust kompileerimise ajal. See tähendab, et meetod kuulub klassi, kuid mitte ühelegi liikmele, sõltumata sellest, kas klassi eksemplar eksisteerib või mitte. Nii nagu sisestusfunktsioon Static void Main, kuna see on staatiline funktsioon, saab seda otse kutsuda.

Virtua: Kui meetod kuulutatakse virtuaalseks, on see virtuaalne meetod, kuni kasutad ClassName muutujat = uus ClassName(); Enne klassi eksemplari deklareerimist see ei eksisteeri reaalses mäluruumis. Seda märksõna kasutatakse väga sageli klassi pärandumises, et pakkuda polümorfismi toetust klassimeetoditele.

overrride: näitab ümberkirjutamist See klass pärib Shape klassilt
Virtuaalne, abstraktne tähendab öelda teistele klassidele, kes soovivad temalt pärida, et sa võid selle meetodi või omaduse üle kirjutada, muidu see pole lubatud.
Kokkuvõte: Abstraktse meetodi deklaratsioon on meetod, mida tuleb üle kirjutada tuletatud klass, mida kasutatakse pärimiseks; Seda võib pidada kujuteldavaks meetodiks ilma realiseerimiseta; Kui klass sisaldab abstraktset meetodit, siis tuleb klass määratleda abstraktse klassina, olenemata sellest, kas see sisaldab teisi üldisi meetodeid või mitte; Abstraktsed klassid ei saa sisaldada substante.

a) Virtuaalse modifikatsiooni meetodil peab olema meetodi teostus (isegi kui tegemist on ainult kahe breketiga) ja abstraktse modifikatsiooni meetodil ei saa olla rakendust.

b) virtuaalset saab ümber kirjutada alamklasside kaupa, abstrakti tuleb ümber kirjutada alamklasside poolt

c) Kui klassi funktsiooni muudetakse abstactiga, tuleb ka klassi nime abstactiga muuta

d) Abstraktselt muudetud klasse ei saa luua eksemplare.

e) Kui C# meetod on valmis alamklassi vanemklassi ümber kirjutama, tuleb meetod muuta vanemklassis virtuaaliga ja alamklassis overide'iga, vältides programmeerija juhuslikku alamklassi vanemklassi vanemmeetodi ümberkirjutamist.

Märkus: Klassid, mis on muudetud abstraktsiga, saab pärida ainult ise, mitte instantsida.

Tõlgendus 2

Nii virtuaalset kui abstraktset kasutatakse vanemklassi muutmiseks, võimaldades alamklassi ümber defineerida, asendades vanemklassi definitsiooni.

Neil on üks ühine joon: kui neid kasutatakse meetodite muutmiseks, tuleb nende ette lisada avalik, vastasel juhul tekivad kompileerimisvead: virtuaalmeetodid või abstraktsed meetodid ei saa olla privaatsed. Lõppude lõpuks võimaldab virtuaalse või abstraktse lisamine alamklassi ümberdefineerida ning alamklass ei saa privaatliikmetele ligi.

Aga need on väga erinevad. (virtuaalne on "virtuaalne", abstraktne on "abstraktne").

(1) Virtuaalse muutmise meetod tuleb rakendada (isegi kui see lisab ainult paari breketeid), samas kui abstraktse muutmise meetodit ei tohi rakendada. Näiteks, kui virtuaalse muutmise meetodit ei rakendata:

Viga: "Test1.fun1()" peab keha deklareerima, kuna see ei ole märgitud abstraktseks, väliseks ega osaliseks   

Abstraktsete modifikaatorite puhul, kui need on rakendatud:


Viga: "Test2.fun2()" ei saa keha deklareerida, kuna see on märgitud abstraktseks   

(2) virtuaalset saab ümber kirjutada alamklasside kaupa, samas kui abstrakti tuleb ümber kirjutada alamklasside kaupa.
Kompileerimisel ei ole viga, kui virtuaalse modifikaatori meetod kirjutatakse ümber, tuleb selle ette lisada ülekirjutus (mis ütleb kompilaatorile, et soovid virtuaalset meetodit ümber kirjutada) ning peab olema rakendus, vastasel juhul on kompileerimine vale:
(3) Kui klassi liiget muudetakse abstraktselt, tuleb abstraktne lisada enne klassi, sest abstraktsed meetodid võivad olla ainult abstraktsetel klassidel.

(4) Abstraktsete klasside eksemplari ei saa luua, neid saab ainult pärida ega instantsida, näiteks: BaseTest2 base2 = uus BaseTest2(); Tekib kompileerimisviga: abstraktne klass või liides ei saa luua eksemplari.

(5) C#-is, kui soovid alamklassi meetodit ümber kirjutada, pead lisama virtuaalse enne vanemmeetodit ja ülekirjutust alamklassi meetodi ette, et vältida programmeerijate kogemata vanem-meetodi ümberkirjutamist alamklassis.

(6) Abstraktne meetod peab olema üle kirjutatud ning virtuaalmeetodil peab olema rakendus (isegi kui see on abstraktses klassis defineeritud meetod).
Tõlgendus 3
Sarnasused:
1. Kõik need võivad olla päritavad
2. Ühtegi neist ei saa instantsierida
3. See võib sisaldada meetodi deklaratsioone
4. Tuletatud klassid peavad rakendama realiseerimata meetodeid
Eristada:
1. Abstraktsed baasklassid võivad määratleda välju, atribuute ja meetodi rakendusi. Liidesed saavad määratleda ainult atribuute, indekseerijaid, sündmusi ja meetodi deklaratsioone ning ei tohi sisaldada välju.
2. Abstraktne klass on mittetäielik klass, mida tuleb täiendada, samas kui liides on käitumuslik norm. Microsofti kohandatud liidestel on alati võimekas väli, mis tõestab, et need väljendavad "Ma suudan seda..." ”
3. Liideseid saab rakendada mitu korda ning abstraktseid klasse saab pärida ainult üks inimene
4. Abstraktsed klassid on rohkem määratletud tihedalt seotud klasside vahel, samas kui enamik liidestest on lõdvalt seotud, kuid kõik rakendavad kindlat funktsiooni
5. Abstraktsed klassid on mõisted, mis on abstraktsed seotud objektide jaast, nii et need peegeldavad asjade sisemist ühisust; Liides on funktsionaalne konventsioon, mis on defineeritud väliste kutsete rahuldamiseks, seega peegeldab see asjade väliseid omadusi
6. Liidesel pole põhimõtteliselt mingeid pärilikkuse eripärasid, see lubab ainult meetodit, mida saab nimetada
7. Liidest saab kasutada tagasikõnede toetamiseks, kuid pärilikkusel seda funktsiooni ei ole
8. Abstraktsete klasside poolt rakendatud konkreetsed meetodid on vaikimisi virtuaalsed, kuid liidese meetodid klassis, mis liidese implementeerivad, on vaikimisi mitte-virtuaalsed, loomulikult saab neid ka virtuaalseteks kuulutada
9. Kui abstraktne klass rakendab liidese, saab liidese metoodi kaardistada abstraktse klassiga abstraktse meetodina ilma seda rakendamata, kuid liidese meetod saab olla teostatud abstraktklassi alamklassis
Kasutusreeglid:
1. Abstraktseid klasse kasutatakse peamiselt tihedalt seotud objektide jaoks, samas kui liidesed sobivad kõige paremini üldfunktsionaalsuse pakkumiseks ebaolulistele klassidele
2. Kui soovid kujundada suurt funktsionaalset üksust, kasuta abstraktseid klasse; Kui soovid kujundada väikeseid, lühikesi funktsionaalseid plokke, kasuta liideseid.
3. Kui eeldatakse, et luuakse mitu komponenti versiooni, loo abstraktne klass. Kui liides on loodud, ei saa seda muuta. Kui on vaja uut liidese versiooni, tuleb luua täiesti uus liides.
4. Kui loodud funktsiooni kasutatakse laia valiku heterogeensete objektide vahel, kasuta liidest; Kui soovid pakkuda ühist rakendatud funktsionaalsust kõigi komponendi rakenduste vahel, kasuta abstraktseid klasse.
5. Analüüsi objekti, täpsusta sisemist ühtsust, et moodustada abstraktne klass, mida kasutatakse objekti olemuse väljendamiseks, st "mida". Liidesed on prioriteediks siis, kui väliseid kõnesid või funktsioone tuleb laiendada
6. Hea liidese definitsioon peaks olema spetsiifiline ja funktsionaalne, mitte multifunktsionaalne, vastasel juhul põhjustab see liidese saastet. Kui klass rakendab ainult ühte liidese funktsiooni, kuid peab liideses rakendama teisi meetodeid, nimetatakse seda liidese reostuseks
7. Püüa vältida pärilikkuse kasutamist formatsioonifunktsiooni saavutamiseks, kuid kasuta musta kasti multipleksimist, st objektide kombineerimist. Pärandumistasemete arvu suurenemise tõttu on kõige otsesem tagajärg see, et kui kutsud selle taksoni klassi, pead need kõik virna laadima! Tagajärgi võib ette kujutada. (Kombineerituna virna põhimõtte mõistmisega). Samal ajal võivad huvilised sõbrad märgata, et Microsoft kasutab sageli objektide kombineerimise meetodit klassi loomisel. Näiteks asp.net. aastal on Page klassil omadused nagu Server Request, kuid tegelikult on need kõik teatud klassi objektid. Selle Page klassi objekti kasutamine teiste klasside meetodite ja omaduste kutsumiseks on väga põhiline disainipõhimõte
Näiteks:
Aknavorme saab kujundada abstraktsete klassidega ning avalikud operatsioonid ja omadused paigutatakse abstraktsesse klassi, nii et vorm ja dialoogiaken saavad sellest abstraktsest klassist pärida ning seejärel laiendada ja täiustada vastavalt oma vajadustele.

Printimistoimingut saab pakkuda liidesena igale vormile, mis seda funktsiooni vajab, sest vormi sisu on erinev ja nad peavad rakendama oma trükifunktsiooni vastavalt oma vajadustele. Printimisel kutsutakse seda ainult liidese kaudu, sõltumata sellest, millist vormi trükitakse.

Ühisjooned, individuaalsus ja valik:
Mõned raamatud kirjutavad, et C# soovitab kasutada liideste abstraktsete baasklasside asemel ning rõhutavad liideste kasutamise mitmeid eeliseid, millega ma ei julge vaielda; eeltoodud nimekirjast on nende vahel siiski palju erinevusi ning selle erinevuse olemasolu peab määrama erinevuse rakendatavates olukordades, näiteks abstraktne baasklass võib pakkuda mõnele meetodile vaikimisi rakendusi, et vältida nende korduvat rakendamist alamklassides ja parandada koodi taaskasutust. See on abstraktsete klasside eelis; Liides võib sisaldada ainult abstraktseid meetodeid. Mis puudutab abstraktsete baasklasside ja liideste kasutamist, sõltub sellest, kuidas kasutajad näevad päritud klasside vahelisi seoseid – kas need on isiksuseerinevused või ühised seosed nende vahel. Las ma illustreerin elulise näitega.

Kui sulle antakse kolm eset – inimesed, kalad ja konnad – ning palutakse kujundada neile baaskategooria, et kokku võtta nende seos, siis esimene asi, mida tunned, on see, et nende vahel on suured erinevused ning ühisjooni on raske abstraheerida. Siin peaksid kaaluma liideste kasutamist abstraktsete baasklasside asemel kolmel põhjusel:
1. Individuaalsus on suurem kui ühisus.
2. Isiksused, kellel on suured erinevused, järgivad mõningaid samu käitumisi.
3. Sama käitumise realiseerimisviisides on suured erinevused.
Sel hetkel antakse sulle veel kolm objekti: ristikarpkala, karp ja kuldkala, ning saad ikkagi kujundada baasklassid, et kokku võtta nendevaheline seos, siis esimene asi, mida mõistad, on see, et kõik kuuluvad kaladele, ja teiseks, et ujumisviis võib olla veidi erinev, seega peaksid kasutama abstraktseid baasklasse liideste asemel; võrreldes eelneva näitega on selleks kolm põhjust:
1. Ühtsus on suurem kui individuaalsus
2. Sama ühisjoonega isikutel peavad olema samad omadused ja käitumised
3. Sama käitumise rakendusmeetodites on teatud erinevusi
Mitmete liideste või abstraktsete baasklasside kasutamise põhjuste seas on kolmas põhjus tegelikult sama, mis kirjeldab polümorfismi mõistet objektorientatsioonis, st see rakendatakse vanemklassi ülekirjutamisega ja vastava meetodi kutsumisega käitusajal vastavalt objekti viitele. Teine põhjus hakkab lahknema – liidesed rõhutavad sama käitumist päritud objektide vahel, samas kui abstraktsed klassid rõhutavad samu omadusi päritud objektide vahel. Mis tõeliselt eristab liideseid abstraktsetest baasklassidest, on järgmised põhjused:

Liideseid kasutatakse siis, kui otsitakse funktsionaalset ühisosa objektide vahel, millel on suured erinevused.
Abstraktseid baasklasse kasutatakse siis, kui otsitakse funktsionaalseid erinevusi objektide vahel, millel on rohkem ühiseid.
Võrreldes sama ja erinevat, saame öelda vaid, et liidestel ja abstraktsetel klassidel on oma tugevused, kuid eeliseid pole. Tegelikus programmeerimispraktikas peame mõõtma oma andeid vastavalt konkreetsele olukorrale, kuid järgmine kogemus ja kogunemine võib anda inspiratsiooni, lisaks minu kogunemisele pärineb paljud neist klassikutest, usun, et nad suudavad testi vastu pidada. Nii et reeglite ja sündmuste puhul õpime neid klassikuid, kõige tähtsam on rakendada seda, mida oleme õppinud, muidugi võidan ma kõigi naeru perekonna sõnadega, palun jätkake.

Reeglid ja sündmused:
1. Pea meeles, et üks objektorienteeritud mõtlemise kõige olulisemaid põhimõtteid on: liidespõhine programmeerimine.
2. Liideste ja abstraktsete klasside abil on paljud ideed 23 disainimustris nutikalt ellu viidud ning arvan, et nende olemus seisneb lihtsalt selles, et need on suunatud abstraktsele programmeerimisele.
3. Abstraktseid klasse tuleks peamiselt kasutada tihedalt seotud objektide jaoks, samas kui liidesed sobivad kõige paremini üldise funktsionaalsuse pakkumiseks ebaolulistele klassidele.
4. Liides keskendub CAN-DO seotüübile, samas kui abstraktne klass keskendub IS-A suhtele.
5. Mitme definitsiooniga objektide käitumine liideses; abstraktsed klassid määratlevad objektide omadused mitmekordselt;
6. Liidese definitsioonid võivad kasutada avalikke, kaitstud, sisemisi ja privaatseid modifikaatoreid, kuid peaaegu kõik liidesed on defineeritud avalikena, seega pole vaja rohkem öelda.
7. "Liides jääb muutumatuks" on oluline tegur, mida tuleks arvestada. Seetõttu tuleks liidestest laienduste lisamisel lisada uusi liideseid, mitte olemasolevaid liideseid.
8. Proovi kujundada liides funktsionaalseks plokiks, millel on üks funktsioon, võttes näiteks .NET Frameworki, IDisposable, IDisposable, IComparable, IEquatable, IEnumerable jne – kõik sisaldavad ainult ühte ühist meetodit.
9. Liidese nime ees olev suurtäht "I" on tava, nagu ka väljanimi algab allkriipsuga, palun järgige neid põhimõtteid.
10. Liideses lülitatakse kõik meetodid vaikimisi avalikuks.
11. Kui versiooniprobleeme oodatakse, saad luua "abstraktse klassi". Näiteks, kui lood koera, kana ja pardi, peaksid kaaluma loomade abstraheerimist, et tulevikus tekkida võivate asjadega toime tulla. Uute liikmete lisamine liidesesse sunnib kõiki tuletatud klasse muutma ja ümber kompileerima, seega on versioonimisülesanded kõige paremini teostatud abstraktsete klassidega.
12. Abstraktsetest klassidest tuletatud mitte-abstraktsed klassid peavad sisaldama kõiki päritud abstraktseid meetodeid ja tegelikke abstraktsete aksessuorite rakendusi.
13. Uut märksõna ei saa kasutada abstraktsete klasside jaoks ega neid pitseerida, sest abstraktseid klasse ei saa instantsida.
14. Staatilisi või virtuaalseid modifikaatoreid ei tohi kasutada abstraktsetes meetodikuulutustes.





Eelmine:C# Enum Simple Permission Design kasutab omadust FlagsAttribute
Järgmine:Huang Yongi Yiyun klassiruumis on nullpõhine arusaam WeChati miniprogrammist
Disclaimer:
Kõik Code Farmer Networki poolt avaldatud tarkvara, programmeerimismaterjalid või artiklid on mõeldud ainult õppimiseks ja uurimistööks; Ülaltoodud sisu ei tohi kasutada ärilistel ega ebaseaduslikel eesmärkidel, vastasel juhul kannavad kasutajad kõik tagajärjed. Selle saidi info pärineb internetist ning autoriõiguste vaidlused ei ole selle saidiga seotud. Ülaltoodud sisu tuleb oma arvutist täielikult kustutada 24 tunni jooksul pärast allalaadimist. Kui sulle programm meeldib, palun toeta originaaltarkvara, osta registreerimist ja saa paremaid ehtsaid teenuseid. Kui esineb rikkumist, palun võtke meiega ühendust e-posti teel.

Mail To:help@itsvse.com