Šis raksts ir mašīntulkošanas spoguļraksts, lūdzu, noklikšķiniet šeit, lai pārietu uz oriģinālo rakstu.

Skats: 18805|Atbildi: 0

[Paziņojums] Līdzības un atšķirības starp virtuālo un (abstraktu) abstraktu un saskarni C#...

[Kopēt saiti]
Publicēts 22.04.2019 14:41:09 | | |
1. interpretācija

C# abstraktais un virtuālais ir mulsinoši, abi saistīti ar mantojumu un ietver ignorēšanas izmantošanu. Apspriedīsim atšķirības starp abiem:

1. Virtuālā metode

Virtuālais atslēgvārds tiek izmantots, lai modificētu bāzes klases metodes. Ir divas situācijas, kad tiek izmantots virtuālais:

1. scenārijs: Virtuālā metode ir definēta pamatklasē, bet virtuālā metode netiek pārrakstīta atvasinātajā klasē. Atvasinātās klases instances izsaukumā virtuālā metode izmanto pamatklases definēto metodi.

2. scenārijs: Virtuālā metode tiek definēta pamatklasē, un pēc tam metode tiek pārrakstīta, izmantojot ignorēšanu atvasinātajā klasē. Izsaukumā uz atvasinātās klases instanci virtuālā metode izmanto atvasināto pārrakstīšanas metodi.

2. Abstraktā metode (abstraktā metode)

Abstrakto atslēgvārdu var izmantot tikai abstraktās klasēs, lai modificētu metodes, un nav īpašas ieviešanas. Abstraktu metožu ieviešana jāīsteno, izmantojot atvasinātās klases ignorēšanas atslēgvārdu.

Būtiskākā atšķirība starp saskarni un abstraktu klasi: abstrakta klase ir nepilnīga klase, objekta abstrakcija, bet saskarne ir uzvedības norma.


3. Atslēgvārdi

Statiska: ja metode ir deklarēta kā statiska, metode ir statiska metode, un kompilators saglabā metodes ieviešanu kompilācijas laikā. Tas nozīmē, ka metode pieder klasei, bet ne kādam dalībniekam, neatkarīgi no tā, vai klases gadījums pastāv vai nav. Tāpat kā ievades funkcija Static void Main, tā kā tā ir statiska funkcija, to var izsaukt tieši.

Virtua: Ja metode ir deklarēta kā virtuāla, tā ir virtuāla metode, līdz izmantojat ClassName mainīgo = new ClassName(); Pirms klases instances pasludināšanas tā neeksistē reālajā atmiņas telpā. Šis atslēgvārds ir ļoti bieži izmantots klases pārmantošanā, lai nodrošinātu polimorfisma atbalstu klases metodēm.

overrride: norāda pārrakstīšanu Šī klase pārmanto no klases Shape
Virtuāls, abstrakts ir pateikt citām klasēm, kas vēlas mantot no viņa, ka jūs varat ignorēt šo metodi vai manu īpašumu, pretējā gadījumā tas nav atļauts.
Anotācija: Abstraktās metodes deklarācija ir metode, kas jāignorē atvasinātai klasei, kas tiek izmantota mantošanai; To var uzskatīt par iedomātu metodi bez realizācijas; Ja klase satur abstraktu metodi, tad klase ir jādefinē kā abstrakta klase, neatkarīgi no tā, vai tā satur citas vispārīgas metodes; Abstraktām klasēm nevar būt vielas.

a) Virtuālās modifikācijas metodei ir jābūt metodes ieviešanai (pat ja tas ir tikai iekavu pāris), un abstraktās modifikācijas metodei nevar būt ieviešana.

b) virtuālo var pārrakstīt pa apakšklasēm, abstrakts jāpārraksta pa apakšklasēm

c) Ja klases funkciju modificē abstact, klases nosaukums ir jāmaina arī ar abstact

d) Abstraktas modificētas klases nevar izveidot instances.

e) Ja C# metode ir sagatavota, lai pārrakstītu vecāku klasi apakšklasē, metode ir jāmodificē ar virtuālu vecākklasē un jāpārveido apakšklasē, izvairoties no programmētāja nejaušas vecāku klases pārrakstīšanas apakšklasē.

Piezīme: Klases, kas modificētas ar abstraktu, var tikai pārmantot, nevis instantiēt.

2. interpretācija

Gan virtuālais, gan abstraktais tiek izmantots, lai modificētu vecāku klasi, ļaujot pārdefinēt bērnu klasi, ignorējot vecāku klases definīciju.

Viņiem ir viena kopīga lieta: ja tos izmanto metožu modificēšanai, to priekšā jāpievieno publiski, pretējā gadījumā būs kompilācijas kļūdas: virtuālās metodes vai abstraktas metodes nevar būt privātas. Galu galā, virtuālā vai abstraktā pievienošana ļauj pārdefinēt apakšklasi, un apakšklase nevar piekļūt privātajiem dalībniekiem.

Bet tie ir ļoti atšķirīgi. (virtuālais ir "virtuāls", abstrakts ir "abstrakts").

(1) Virtuālās modifikācijas metode ir jāievieš (pat ja tā pievieno tikai breketes), bet abstraktās modifikācijas metode nedrīkst tikt īstenota. Piemēram, ja virtuālās modifikācijas metode netiek īstenota:

Kļūda: "Test1.fun1()" ir jādeklarē pamatteksts, jo tas nav atzīmēts kā abstrakts, ārējs vai daļējs   

Abstraktiem modifikatoriem, ja tie ir ieviesti:


Kļūda: "Test2.fun2()" nevar deklarēt pamattekstu, jo tas ir atzīmēts kā abstrakts   

(2) virtuālo var pārrakstīt pa apakšklasēm, bet abstrakts ir jāpārraksta ar apakšklasēm.
Kompilācijā nav kļūdu, ja virtuālā modifikatora metode tiek pārrakstīta, tā priekšā jāpievieno ignorēšana (kas norāda kompilatoram, ka vēlaties pārrakstīt virtuālo metodi), un ir jābūt ieviešanai, pretējā gadījumā kompilācija būs nepareiza:
(3) Ja klases loceklis tiek modificēts ar abstraktu, pirms klases jāpievieno kopsavilkums, jo tikai abstraktām klasēm var būt abstraktas metodes.

(4) Abstraktu klašu gadījumus nevar izveidot, tos var tikai pārmantot un instancēt, piemēram: BaseTest2 base2 = jauns BaseTest2(); Būs kompilācijas kļūda: Abstrakta klase vai interfeiss nevar izveidot instanci.

(5) C#, ja vēlaties pārrakstīt metodi apakšklasē, jums ir jāpievieno virtuālais pirms vecākmetodes un jāignorē pirms apakšklases metodes, lai izvairītos no programmētāju nejaušas vecāku metodes pārrakstīšanas apakšklasē.

(6) Abstraktā metode ir jāpārraksta, un virtuālajai metodei ir jābūt ieviešanai (pat ja tā ir metode, kas definēta abstraktajā klasē).
3. interpretācija
Līdzības:
1. Tos visus var mantot
2. Nevienu no tiem nevar instantiēt
3. Tajā var būt metodes deklarācijas
4. Atvasinātajām klasēm jāievieš nerealizētas metodes
Atšķirt:
1. Abstraktas pamatklases var definēt laukus, atribūtus un metožu ieviešanu. Interfeisi var definēt tikai atribūtus, indeksētājus, notikumus un metožu deklarācijas, un tajos nevar būt lauki.
2. Abstrakta klase ir nepilnīga klase, kas ir jāpilnveido, bet saskarne ir uzvedības norma. Microsoft pielāgotajām saskarnēm vienmēr ir spējīgs lauks, lai pierādītu, ka tās ir "Es to varu izdarīt..." ”
3. Saskarnes var ieviest vairākas reizes, un abstraktas klases var pārmantot tikai viena persona
4. Abstraktās klases ir vairāk definētas starp cieši saistītu klašu sēriju, bet lielākā daļa saskarņu ir brīvi saistītas, bet visas īsteno noteiktu funkciju
5. Abstraktās klases ir jēdzieni, kas abstrahēti no saistītu objektu virknes, tāpēc tie atspoguļo lietu iekšējo kopīgumu; Interfeiss ir funkcionāla konvencija, kas definēta, lai apmierinātu ārējos zvanus, tāpēc tā atspoguļo lietu ārējās īpašības
6. Saskarnei būtībā nav nekādu specifisku mantojuma īpašību, tā sola tikai metodi, ko var saukt
7. Interfeisu var izmantot, lai atbalstītu atzvanīšanu, bet mantojumam nav šīs funkcijas
8. Konkrētās metodes, ko īsteno abstraktas klases, pēc noklusējuma ir virtuālas, bet saskarnes metodes klasē, kas īsteno saskarni, pēc noklusējuma, protams, varat arī pasludināt tās par virtuālām
9. Ja abstraktā klase ievieš saskarni, saskarnes metodi var kartēt uz abstrakto klasi kā abstraktu metodi, to neieviešot, bet saskarnes metodi var ieviest abstraktās klases apakšklasē
Lietošanas noteikumi:
1. Abstraktās klases galvenokārt tiek izmantotas cieši saistītiem objektiem, savukārt saskarnes vislabāk izmanto, lai nodrošinātu vispārēju funkcionalitāti neatbilstošām klasēm
2. Ja vēlaties izveidot lielu funkcionālu vienību, izmantojiet abstraktas klases; Ja vēlaties izstrādāt mazus, kodolīgus funkcionālus blokus, izmantojiet saskarnes.
3. Ja ir paredzēts izveidot vairākas komponenta versijas, izveidojiet abstraktu klasi. Kad interfeiss ir izveidots, to nevar mainīt. Ja nepieciešama jauna saskarnes versija, jāizveido pilnīgi jauns interfeiss.
4. Ja izveidotā funkcija tiks izmantota starp plašu neviendabīgu objektu klāstu, izmantojiet saskarni; Ja vēlaties nodrošināt vienotu implementēto funkcionalitāti visās komponenta implementācijās, izmantojiet abstraktas klases.
5. Analizējiet objektu, uzlabojiet iekšējo kopību, lai izveidotu abstraktu klasi, ko izmanto, lai izteiktu objekta būtību, tas ir, "ko". Interfeisiem tiek piešķirta prioritāte, ja ir jāpaplašina ārējie zvani vai funkcijas
6. Labai saskarnes definīcijai jābūt specifiskai un funkcionālai, nevis daudzfunkcionālai, pretējā gadījumā tā radīs saskarnes piesārņojumu. Ja klase īsteno tikai vienu saskarnes funkciju, bet saskarnē ir jāievieš citas metodes, to sauc par saskarnes piesārņojumu
7. Mēģiniet izvairīties no mantojuma izmantošanas, lai sasniegtu veidošanas funkciju, bet izmantojiet melnās kastes multipleksēšanu, tas ir, objektu kombināciju. Sakarā ar mantojuma līmeņu skaita palielināšanos, vistiešākās sekas ir tādas, ka, izsaucot klasi šajā taksonā, jums tie visi ir jāielādē kaudzē! Sekas var iedomāties. (Apvienojumā ar steka principa izpratni). Tajā pašā laikā ieinteresētie draugi var pamanīt, ka Microsoft bieži izmanto objektu kombinācijas metodi, veidojot klasi. Piemēram, asp.net klasei Page ir tādi rekvizīti kā servera pieprasījums, bet patiesībā tie visi ir noteiktas klases objekti. Šī Page klases objekta izmantošana, lai izsauktu citu klašu metodes un īpašības, ir ļoti vienkāršs dizaina princips
Piemēram:
Logu veidlapas var noformēt ar abstraktām klasēm, un publiskās operācijas un rekvizītus var ievietot abstraktā klasē, lai veidlapa un dialoglodziņš varētu mantot no šīs abstraktās klases un pēc tam paplašināt un uzlabot atbilstoši savām vajadzībām.

Drukas operāciju var nodrošināt kā interfeisu katrai veidlapai, kurai nepieciešama šī funkcija, jo veidlapas saturs ir atšķirīgs, un viņiem ir jāievieš sava drukāšanas funkcija atbilstoši savām prasībām. Drukājot, tas tiek izsaukts tikai caur saskarni, neatkarīgi no tā, kura forma tiek drukāta.

Kopīgība, individualitāte un izvēle:
Dažas grāmatas raksta, ka C# iesaka izmantot saskarnes, nevis abstraktas bāzes klases, un uzsver daudzās saskarņu izmantošanas priekšrocības, kurām es neuzdrošinos nepiekrist, no iepriekš minētā saraksta joprojām ir daudz atšķirību starp abiem, un šīs atšķirības esamībai ir jānosaka atšķirība piemērojamajos scenārijos, piemēram, abstraktā bāzes klasē var nodrošināt noklusējuma ieviešanu dažām metodēm, lai izvairītos no atkārtotas to ieviešanas apakšklasēs un uzlabotu koda atkārtotu izmantošanu. Tā ir abstraktu klašu priekšrocība; Interfeiss var saturēt tikai abstraktas metodes. Kas attiecas uz to, kad izmantot abstraktas bāzes klases un kad izmantot saskarnes, tas ir atkarīgs no tā, kā lietotāji redz savienojumus starp mantotām klasēm, vai tās ir personības atšķirības vai kopīgas saiknes starp tām. Ļaujiet man ilustrēt ar dzīves piemēru.

Ja jums tiek doti trīs objekti, proti, cilvēki, zivis un vardes, un jums tiek lūgts izveidot pamatkategoriju, lai tie apkopotu saikni starp tiem, tad pirmā lieta, ko jūs sajutīsiet, ir tas, ka starp tiem ir lielas atšķirības, un ir grūti abstrahēt kopīgās lietas. Šeit jums vajadzētu apsvērt iespēju izmantot saskarnes, nevis abstraktas bāzes klases trīs iemeslu dēļ:
1. Individualitāte ir lielāka par kopīgumu.
2. Personībām ar lielām atšķirībām ir dažas no tām pašām uzvedībām.
3. Ir lielas atšķirības vienas un tās pašas uzvedības realizācijas metodēs.
Šajā laikā jums tiek doti vēl trīs objekti, proti, krusta karpas, karpas un zelta zivtiņa, un joprojām ļaujiet jums izstrādāt bāzes klases, lai apkopotu saikni starp tām, tad pirmā lieta, ko jūs saprotat, ir tas, ka tās visas pieder zivīm, un otrā ir tā, ka veids, kā viņi peld, var būt nedaudz atšķirīgs, tāpēc saskarņu vietā jāizmanto abstraktas bāzes klases, salīdzinot ar iepriekš minēto piemēru, ir trīs iemesli:
1. Kopīgums ir lielāks par individualitāti
2. Indivīdiem ar tādu pašu kopīgību jābūt vienādiem atribūtiem un uzvedībai
3. Ir zināmas atšķirības vienas un tās pašas uzvedības īstenošanas metodēs
Starp vairākiem interfeisu vai abstraktu bāzes klašu izmantošanas iemesliem trešais iemesls faktiski ir tāds pats, kas apraksta polimorfisma jēdzienu objektorientētā, tas ir, tas tiek īstenots, ignorējot vecāku klasi un izsaucot atbilstošo metodi izpildlaikā atbilstoši nodotajai objekta atsaucei. Otrais iemesls sāk atšķirties, saskarnes uzsver to pašu uzvedību starp mantotiem objektiem, bet abstraktās klases uzsver arī tās pašas īpašības starp mantotiem objektiem. Tas, kas patiešām atšķir saskarnes no abstraktām bāzes klasēm, ir šādi iemesli:

Saskarnes tiek izmantotas, ja tiek meklēta funkcionāla kopīgība starp objektiem ar lielām atšķirībām.
Abstraktas pamatklases tiek izmantotas, ja tiek meklētas funkcionālas atšķirības starp objektiem ar lielāku kopīgību.
Salīdzinot to pašu un atšķirīgo, mēs varam tikai teikt, ka saskarnēm un abstraktām klasēm ir savas stiprās puses, bet nav priekšrocību. Faktiskajā programmēšanas praksē mums ir jāmēra savi talanti atbilstoši konkrētajai situācijai, bet šāda pieredze un uzkrāšana var sniegt jums iedvesmu, papildus dažiem maniem uzkrājumiem, daudzi no tiem nāk no klasikas, es uzskatu, ka viņi var izturēt pārbaudi. Tātad noteikumos un gadījumos mēs mācāmies šo klasiku, vissvarīgākais ir pielietot to, ko esam iemācījušies, protams, es uzvarēšu ikviena smieklus ar ģimenes vārdiem, lūdzu, turpiniet.

Noteikumi un gadījumi:
1. Atcerieties, ka viens no svarīgākajiem objektorientētās domāšanas principiem ir: saskarnes orientēta programmēšana.
2. Ar saskarņu un abstraktu nodarbību palīdzību daudzas idejas 23 dizaina modeļos ir gudri īstenotas, un es domāju, ka to būtība ir vienkārši tā, ka tās ir orientētas uz abstraktu programmēšanu.
3. Abstraktās klases galvenokārt jāizmanto cieši saistītiem objektiem, savukārt saskarnes vislabāk izmanto, lai nodrošinātu vispārēju funkcionalitāti neatbilstošām klasēm.
4. Interfeiss koncentrējas uz CAN-DO attiecību tipu, bet abstraktā klase koncentrējas uz IS-A attiecībām.
5. Daudzdefinētu objektu uzvedība saskarnē; abstraktas klases daudzkārt definē objektu īpašības;
6. Interfeisa definīcijas var izmantot publiskus, aizsargātus, iekšējos un privātos modifikatorus, bet gandrīz visas saskarnes ir definētas kā publiskas, tāpēc nav nepieciešams teikt vairāk.
7. "Saskarne paliek nemainīga" ir svarīgs faktors, kas jāņem vērā. Tāpēc, pievienojot paplašinājumus no saskarnēm, jāpievieno jaunas saskarnes, nevis esošās saskarnes.
8. Mēģiniet veidot saskarni funkcionālā blokā ar vienu funkciju, piemēram, ņemot .NET Framework piemēru, IDisposable, IDisposable, IComparable, IEquatable, IEnumerable utt.
9. Lielais burts "I" saskarnes nosaukuma priekšā ir konvencija, tāpat kā lauka nosaukums sākas ar pasvītrojumu, lūdzu, ievērojiet šos principus.
10. Saskarnē visas metodes pēc noklusējuma ir publiskas.
11. Ja ir sagaidāmas versijas problēmas, varat izveidot "abstraktu klasi". Piemēram, ja jūs izveidojat suni, vistu un pīli, jums vajadzētu apsvērt dzīvnieku abstrahēšanu, lai risinātu lietas, kas var rasties nākotnē. Jaunu dalībnieku pievienošana saskarnei liek modificēt un pārkompilēt visas atvasinātās klases, tāpēc versiju problēmas vislabāk īstenot ar abstraktām klasēm.
12. Neabstraktām klasēm, kas atvasinātas no abstraktām klasēm, jāietver visas pārmantotās abstraktās metodes un abstraktu pietekļu faktiskās ieviešanas.
13. Jauno atslēgvārdu nevar izmantot abstraktām klasēm, kā arī tās nevar aizzīmogot, jo abstraktas klases nevar instancēt.
14. Statiskos vai virtuālos modifikatorus nevar izmantot abstraktās metožu deklarācijās.





Iepriekšējo:C# Enum vienkāršā atļauju noformējumā tiek izmantots rekvizīts FlagsAttribute
Nākamo:Huang Yong Yiyun klasē ir nulles izpratne par WeChat mini programmu
Atruna:
Visa programmatūra, programmēšanas materiāli vai raksti, ko publicē Code Farmer Network, ir paredzēti tikai mācību un pētniecības mērķiem; Iepriekš minēto saturu nedrīkst izmantot komerciāliem vai nelikumīgiem mērķiem, pretējā gadījumā lietotājiem ir jāuzņemas visas sekas. Informācija šajā vietnē nāk no interneta, un autortiesību strīdiem nav nekāda sakara ar šo vietni. Iepriekš minētais saturs ir pilnībā jāizdzēš no datora 24 stundu laikā pēc lejupielādes. Ja jums patīk programma, lūdzu, atbalstiet oriģinālu programmatūru, iegādājieties reģistrāciju un iegūstiet labākus oriģinālus pakalpojumus. Ja ir kādi pārkāpumi, lūdzu, sazinieties ar mums pa e-pastu.

Mail To:help@itsvse.com