1 aiškinimas
C# abstraktus ir virtualus yra painūs, abu susiję su paveldėjimu ir apima nepaisymo naudojimą. Aptarkime skirtumus tarp jų:
1. Virtualus metodas
Virtualus raktažodis naudojamas bazinės klasės metodams modifikuoti. Yra dvi situacijos, kai naudojamas virtualus:
1 scenarijus: Virtualus metodas apibrėžiamas pagrindinėje klasėje, tačiau virtualus metodas nėra perrašomas išvestinėje klasėje. Iškviečiant išvestinės klasės egzempliorių, virtualusis metodas naudoja bazinės klasės apibrėžtą metodą.
2 scenarijus: Virtualus metodas apibrėžiamas pagrindinėje klasėje, o tada metodas perrašomas naudojant išvestinės klasės nepaisymą. Iškviečiant išvestinės klasės egzempliorių, virtualusis metodas naudoja išvestinį perrašymo metodą.
2. Abstraktus metodas (abstraktus metodas)
Abstraktus raktažodis gali būti naudojamas tik abstrakčiose klasėse metodams modifikuoti, ir nėra konkretaus įgyvendinimo. Abstrakčių metodų įgyvendinimas turi būti įgyvendintas naudojant išvestinės klasės raktažodį perrašyti.
Esminis skirtumas tarp sąsajos ir abstrakčios klasės: abstrakti klasė yra neužbaigta klasė, objekto abstrakcija, o sąsaja yra elgesio norma.
3. Raktiniai žodžiai
Statinis: kai metodas deklaruojamas kaip statinis, metodas yra statinis metodas ir kompiliatorius išlaiko metodo įgyvendinimą kompiliavimo metu. Tai yra, metodas priklauso klasei, bet ne bet kuriam nariui, nepriklausomai nuo to, ar klasės egzempliorius egzistuoja, ar ne. Kaip ir įėjimo funkcija Static void Main, kadangi tai yra statinė funkcija, ją galima iškviesti tiesiogiai.
Virtua: Kai metodas deklaruojamas kaip virtualus, jis yra virtualus metodas, kol nenaudojate ClassName kintamojo = new ClassName(); Prieš deklaruojant klasės egzempliorių, jis neegzistuoja realioje atminties erdvėje. Šis raktažodis labai dažnai naudojamas klasių paveldėjimui, siekiant užtikrinti klasės metodų polimorfizmo palaikymą.
overrride: nurodo perrašymą Ši klasė paveldi iš Shape klasės virtualus, abstraktus yra pasakyti kitoms klasėms, kurios nori paveldėti iš jo, kad galite nepaisyti šio metodo ar mano savybės, kitaip tai neleidžiama. Anotacija: Abstraktus metodo deklaracija yra metodas, kurį turi perrašyti išvestinė klasė, kuri naudojama paveldėti; Tai gali būti laikoma įsivaizduojamu metodu be realizacijos; Jei klasėje yra abstraktus metodas, tada klasė turi būti apibrėžta kaip abstrakti klasė, nepriklausomai nuo to, ar joje yra kitų bendrųjų metodų, ar ne; Abstrakčios klasės negali turėti substancijų.
a) Virtualios modifikacijos metodas turi turėti metodo įgyvendinimą (net jei tai tik skliaustų pora), o abstrakčios modifikacijos metodas negali būti įgyvendintas.
b) virtualus gali būti perrašytas poklasiais, santrauka turi būti perrašyta poklasiais
c) Jei klasės funkciją modifikuoja abstact, klasės pavadinimas taip pat turi būti pakeistas abstact
d) Abstrakčios modifikuotos klasės negali būti sukurtos egzempliorių.
e) Jei C# metodas yra paruoštas perrašyti pirminę klasę poklasyje, metodas turi būti modifikuotas virtualiu pirminėje klasėje ir overide poklasyje, išvengiant programuotojo atsitiktinio pirminės klasės perrašymo poklasio pirminio metodo.
Pastaba: Klasės, modifikuotos abstrakčiais, gali būti tik paveldimos, o ne instanciuojamos.
2 aiškinimas
Tiek virtuali, tiek abstrakti naudojami pirminei klasei modifikuoti, todėl antrinę klasę galima iš naujo apibrėžti nepaisydami pirminės klasės apibrėžimo.
Jie turi vieną bendrą bruožą: jei jie naudojami metodams modifikuoti, priešais juos reikia pridėti viešą, kitaip bus kompiliavimo klaidų: virtualūs metodai ar abstraktūs metodai negali būti privatūs. Galų gale, pridedant virtualų ar abstraktų galima iš naujo apibrėžti poklasį, o poklasis negali pasiekti privačių narių.
Bet jie labai skirtingi. (virtualus yra "virtualus", abstraktus yra "abstraktus").
(1) Virtualaus modifikavimo metodas turi būti įgyvendintas (net jei jis prideda tik porą breketų), o abstrakčios modifikacijos metodas neturi būti įgyvendintas. Pavyzdžiui, jei virtualaus modifikavimo metodas neįgyvendinamas:
Klaida: "Test1.fun1()" turi deklaruoti tekstą, nes jis nepažymėtas kaip abstraktus, išorinis ar dalinis
Abstrakčių modifikatorių, jei jie įdiegti:
Klaida: "Test2.fun2()" negali deklaruoti teksto, nes jis pažymėtas kaip abstraktus
(2) virtualus gali būti perrašytas poklasiais, o santrauka turi būti perrašyta poklasiais.
Kompiliuojant nėra klaidos, jei virtualaus modifikatoriaus metodas yra perrašytas, priešais jį reikia pridėti nepaisymą (kuris nurodo kompiliatoriui, kad norite perrašyti virtualų metodą), ir turi būti įgyvendinimas, kitaip kompiliacija bus neteisinga:
(3) Jei klasės narys modifikuojamas abstrakčiai, prieš klasę turi būti pridėta santrauka, nes tik abstrakčios klasės gali turėti abstrakčius metodus.
(4) Abstrakčių klasių egzempliorių negalima sukurti, jie gali būti tik paveldimi ir negali būti instanciuojami, pavyzdžiui: BaseTest2 base2 = naujas BaseTest2(); Įvyks kompiliavimo klaida: Abstrakti klasė arba sąsaja negali sukurti egzemplioriaus.
(5) C#, jei norite perrašyti metodą poklasyje, turite pridėti virtualų prieš pirminį metodą ir nepaisyti prieš poklasio metodą, kad programuotojai netyčia neperrašytų pirminio metodo poklasyje.
(6) Abstraktus metodas turi būti perrašytas, o virtualus metodas turi turėti įgyvendinimą (net jei tai yra abstrakčioje klasėje apibrėžtas metodas).
3 aiškinimas Panašumai: 1. Jie visi gali būti paveldimi 2. Nė vieno iš jų negalima sukurti 3. Jame gali būti metodų deklaracijų 4. Išvestinės klasės turi įgyvendinti nerealizuotus metodus Atskirti: 1. Abstrakčios bazinės klasės gali apibrėžti laukus, atributus ir metodų įgyvendinimą. Sąsajos gali apibrėžti tik atributus, indeksavimo priemones, įvykius ir metodų deklaracijas, jose negali būti laukų. 2. Abstrakti klasė yra nepilna klasė, kurią reikia toliau tobulinti, o sąsaja yra elgesio norma. "Microsoft" pasirinktinės sąsajos visada ateina su galimu lauku, įrodančiu, kad jie yra išraiškos "Aš galiu tai padaryti..." ” 3. Sąsajos gali būti įdiegtos kelis kartus, o abstrakčias klases gali paveldėti tik vienas asmuo 4. Abstrakčios klasės yra labiau apibrėžtos tarp glaudžiai susijusių klasių serijos, o dauguma sąsajų yra laisvai susijusios, tačiau visos įgyvendina tam tikrą funkciją 5. Abstrakčios klasės yra sąvokos, abstrahuotos iš susijusių objektų serijos, todėl jos atspindi vidinį daiktų bendrumą; Sąsaja yra funkcinė konvencija, apibrėžta išoriniams skambučiams patenkinti, todėl ji atspindi išorines daiktų savybes 6. Sąsaja iš esmės neturi jokių specifinių paveldėjimo savybių, ji tik žada metodą, kurį galima pavadinti 7. Sąsaja gali būti naudojama atgaliniams skambinimams palaikyti, tačiau paveldėjimas šios funkcijos neturi 8. Konkretūs abstrakčių klasių įdiegti metodai pagal numatytuosius nustatymus yra virtualūs, tačiau sąsają įgyvendinantys klasės sąsajos metodai pagal numatytuosius nustatymus yra nevirtualūs, žinoma, taip pat galite juos paskelbti virtualiais 9. Jei abstrakti klasė įgyvendina sąsają, sąsajos metodas gali būti susietas su abstrakčia klase kaip abstraktus metodas jo neįgyvendinant, tačiau sąsajos metodas gali būti įgyvendintas abstrakčios klasės poklasyje Naudojimo taisyklės: 1. Abstrakčios klasės daugiausia naudojamos glaudžiai susijusiems objektams, o sąsajos geriausiai naudojamos bendroms nesvarbių klasių funkcijoms teikti 2. Jei norite suprojektuoti didelį funkcinį vienetą, naudokite abstrakčias klases; Jei norite suprojektuoti mažus, glaustus funkcinius blokus, naudokite sąsajas. 3. Jei tikimasi sukurti kelias komponento versijas, sukurkite abstrakčią klasę. Sukūrus sąsają, jos keisti negalima. Jei reikalinga nauja sąsajos versija, reikia sukurti visiškai naują sąsają. 4. Jei sukurta funkcija bus naudojama tarp daugybės nevienalyčių objektų, naudokite sąsają; Jei norite teikti bendras įdiegtas funkcijas visuose komponento diegimuose, naudokite abstrakčias klases. 5. Išanalizuokite objektą, patobulinkite vidinį bendrumą, kad suformuotumėte abstrakčią klasę, kuri naudojama objekto esmei išreikšti, tai yra "ką". Sąsajos yra prioritetinės, kai reikia išplėsti išorinius skambučius ar funkcijas 6. Geras sąsajos apibrėžimas turėtų būti specifinis ir funkcionalus, o ne daugiafunkcinis, kitaip jis sukels sąsajos taršą. Jei klasė įgyvendina tik vieną sąsajos funkciją, bet sąsajoje turi įdiegti kitus metodus, tai vadinama sąsajos tarša 7. Stenkitės vengti paveldėjimo, kad pasiektumėte formavimo funkciją, tačiau naudokite juodosios dėžės multipleksavimą, tai yra objektų derinimą. Dėl paveldėjimo lygių skaičiaus padidėjimo, tiesioginė pasekmė yra ta, kad kai iškviečiate klasę šiame taksone, turite juos visus įkelti į krūvą! Pasekmes galima įsivaizduoti. (Kartu su kamino principo supratimu). Tuo pačiu metu susidomėję draugai gali pastebėti, kad "Microsoft" dažnai naudoja objektų derinimo metodą kurdama klasę. Pavyzdžiui, asp.net m. "Page" klasė turi tokias savybes kaip "Server Request", tačiau iš tikrųjų jie visi yra tam tikros klasės objektai. Šio Page klasės objekto naudojimas kitų klasių metodams ir savybėms iškviesti yra labai pagrindinis dizaino principas Pavyzdžiui: Langų formos gali būti kuriamos su abstrakčiomis klasėmis, o viešosios operacijos ir ypatybės gali būti įtrauktos į abstrakčią klasę, kad forma ir dialogo langas galėtų paveldėti iš šios abstrakčios klasės, o tada išplėsti ir tobulinti pagal savo poreikius.
Spausdinimo operacija gali būti pateikta kaip sąsaja su kiekviena forma, kuriai reikalinga ši funkcija, nes formos turinys yra skirtingas, ir jie turi įdiegti savo spausdinimo funkciją pagal savo reikalavimus. Spausdinant jis iškviečiamas tik per sąsają, nepriklausomai nuo to, kokia forma spausdinama.
Bendrumas, individualumas ir pasirinkimas: Kai kuriose knygose rašoma, kad C# rekomenduoja naudoti sąsajas, o ne abstrakčias bazines klases, ir pabrėžia daugybę sąsajų naudojimo privalumų, su kuriais nedrįstu nesutikti, iš aukščiau pateikto sąrašo vis dar yra daug skirtumų tarp jų, ir šio skirtumo egzistavimas turi nulemti taikytinų scenarijų skirtumą, pavyzdžiui, abstrakčioje bazinėje klasėje gali būti numatyti kai kurių metodų numatytieji įgyvendinimai, kad būtų išvengta pakartotinio jų įgyvendinimo poklasiuose ir pagerėtų kodo pakartotinis naudojimas. Tai yra abstrakčių klasių pranašumas; Sąsajoje gali būti tik abstrakčių metodų. Kalbant apie tai, kada naudoti abstrakčias bazines klases, o kada naudoti sąsajas, tai priklauso nuo to, kaip vartotojai mato ryšius tarp paveldėtų klasių, ar tai asmenybės skirtumai, ar bendri ryšiai tarp jų. Leiskite man iliustruoti gyvenimo pavyzdžiu.
Jei jums duodami trys objektai, t. y. žmonės, žuvys ir varlės, ir jūsų bus paprašyta sukurti jiems bazinę kategoriją, kad apibendrintumėte jų ryšį, pirmas dalykas, kurį pajusite, yra tai, kad tarp jų yra didelių skirtumų ir sunku abstrahuoti bendrumus. Čia turėtumėte apsvarstyti galimybę naudoti sąsajas, o ne abstrakčias bazines klases dėl trijų priežasčių:
1. Individualumas yra didesnis nei bendrumas. 2. Asmenybės, turinčios didelių skirtumų, elgiasi panašiai. 3. To paties elgesio realizavimo metodai labai skiriasi. Šiuo metu jums suteikiami dar trys objektai, būtent karosai, karpiai ir auksinės žuvelės, ir vis tiek leidžiate kurti bazines klases, apibendrinančias jų ryšį, tada pirmas dalykas, kurį suprantate, yra tai, kad jie visi priklauso žuvims, o antrasis dalykas yra tai, kad jų plaukimo būdas gali šiek tiek skirtis, todėl vietoj sąsajų turėtumėte naudoti abstrakčias bazines klases, palyginti su aukščiau pateiktu pavyzdžiu, yra trys priežastys:
1. Bendrumas yra didesnis nei individualumas 2. Asmenys, turintys tą patį bendrumą, turi turėti tas pačias savybes ir elgesį 3. Yra tam tikrų to paties elgesio įgyvendinimo metodų skirtumų Tarp kelių sąsajų ar abstrakčių bazinių klasių naudojimo priežasčių trečioji priežastis iš tikrųjų yra ta pati, kuri apibūdina polimorfizmo sąvoką objektinėje orientacijoje, tai yra, ji įgyvendinama nepaisydama pirminės klasės ir iškviečiant atitinkamą metodą vykdymo metu pagal perduotą objekto nuorodą. Antroji priežastis pradeda skirtis, kai sąsajos pabrėžia tą patį elgesį tarp paveldėtų objektų, o abstrakčios klasės taip pat pabrėžia tas pačias savybes tarp paveldėtų objektų. Kas iš tikrųjų skiria sąsajas nuo abstrakčių bazinių klasių yra šios priežastys:
Sąsajos naudojamos, kai ieškoma funkcinio bendrumo tarp objektų, turinčių didelių skirtumų. Abstrakčios bazinės klasės naudojamos, kai ieškoma funkcinių skirtumų tarp objektų, turinčių daugiau bendrumo. Lygindami tuos pačius ir skirtingus, galime pasakyti tik tiek, kad sąsajos ir abstrakčios klasės turi savo stipriąsias puses, tačiau privalumų nėra. Faktinėje programavimo praktikoje turime matuoti savo talentus pagal konkrečią situaciją, tačiau ši patirtis ir kaupimas gali suteikti jums įkvėpimo, be kai kurių mano kaupimo, daugelis jų ateina iš klasikos, tikiu, kad jie gali atlaikyti išbandymą. Taigi taisyklėse ir progose mes mokomės šios klasikos, svarbiausia pritaikyti tai, ką išmokome, žinoma, aš laimėsiu visų juoką šeimos žodžiais, prašau tęsti.
Taisyklės ir progos: 1. Atminkite, kad vienas iš svarbiausių objektinio mąstymo principų yra: į sąsają orientuotas programavimas. 2. Sąsajų ir abstrakčių klasių pagalba daugelis 23 dizaino modelių idėjų buvo sumaniai įgyvendintos, ir manau, kad jų esmė yra tiesiog ta, kad jos yra orientuotos į abstraktų programavimą. 3. Abstrakčios klasės daugiausia turėtų būti naudojamos glaudžiai susijusiems objektams, o sąsajos geriausiai naudojamos bendroms nesvarbių klasių funkcijoms suteikti. 4. Sąsaja sutelkia dėmesį į CAN-DO ryšio tipą, o abstrakti klasė - į IS-A ryšį. 5. Kelių apibrėžtų objektų elgesys sąsajoje; abstrakčios klasės apibrėžia objektų savybes; 6. Sąsajos apibrėžimuose gali būti naudojami viešieji, apsaugoti, vidiniai ir privatūs modifikatoriai, tačiau beveik visos sąsajos apibrėžiamos kaip viešos, todėl nereikia daugiau sakyti. 7. "Sąsaja išlieka nepakitusi" yra svarbus veiksnys, į kurį reikėtų atsižvelgti. Todėl pridedant plėtinius iš sąsajų reikia pridėti naujų, o ne esamų sąsajų. 8. Pabandykite suprojektuoti sąsają į funkcinį bloką su viena funkcija, imdami .NET Framework kaip pavyzdį, IDisposable, IDisposable, IComparable, IEquatable, IEnumerable ir kt. visi turi tik vieną bendrą metodą. 9. Didžioji raidė "I" prieš sąsajos pavadinimą yra konvencija, kaip ir lauko pavadinimas prasideda pabraukimu, laikykitės šių principų. 10. Sąsajoje visi numatytieji metodai yra vieši. 11. Jei tikimasi versijos problemų, galite sukurti "abstrakčią klasę". Pavyzdžiui, jei sukuriate šunį, vištą ir antį, turėtumėte apsvarstyti galimybę abstrahuoti gyvūnus, kad galėtumėte susidoroti su dalykais, kurie gali kilti ateityje. Pridėjus naujų narių į sąsają, visos išvestinės klasės turi būti modifikuotos ir perkompiliuojamos, todėl versijų kūrimo problemas geriausia įgyvendinti abstrakčiomis klasėmis. 12. Neabstrakčios klasės, išvestos iš abstrakčių klasių, turi apimti visus paveldėtus abstrakčius metodus ir faktinius abstrakčių prieigų įgyvendinimus. 13. Naujas raktažodis negali būti naudojamas abstrakčioms klasėms ir negali būti užantspauduotas, nes abstrakčios klasės negali būti sukurtos. 14. Statiniai arba virtualūs modifikatoriai negali būti naudojami abstrakčių metodų deklaracijose.
|