1. értelmezés
C#-ban az absztrakt és a virtuális zavarosak, mindkettő az öröklődéshez kapcsolódik, és felülírást igényel. Beszéljük meg a különbségeket a kettő között:
1. Virtuális módszer
A virtuális kulcsszót az alap osztály metódusainak módosítására használják. Két helyzet van, amikor virtuális esetet használnak:
1. forgatókönyv: Egy virtuális metódus definiálva van az alap osztályban, de a virtuális metódus nem írja át a származtatott osztályban. A vezetett osztály példányának hívásában a virtuális metódus az alaposztály által meghatározott metódust használja.
2. forgatókönyv: Egy virtuális metódus definiál az alap osztályban, majd a metódust felülírással újraírják a származtatott osztályban. A levezetett osztály példányának hívásában a virtuális metódus a vezetett újraírási metódust használja.
2. Absztrakt módszer (absztrakt módszer)
Az absztrakt kulcsszó csak absztrakt osztályokban használható metódusok módosítására, és nincs konkrét megvalósítása. Az absztrakt metódusok megvalósítását a vezetett osztály felülíró kulcsszavajával kell megvalósítani.
A legfontosabb különbség egy interfész és egy absztrakt osztály között: az absztrakt osztály egy hiányos osztály, egy objektum absztrakciója, míg az interfész viselkedési norma.
3. Kulcsszavak
Static: Ha egy metódust statikus módnak nyilvánítunk, az a metódus statikus metódus, és a fordító megőrzi a metódus implementációját a fordítás idején. Vagyis a metódus egy osztályhoz tartozik, de nem bármely taghoz, függetlenül attól, hogy létezik-e egy példány az osztályból vagy sem. Akárcsak a Static void Main belépési függvény, mivel statikus függvény, közvetlenül hívható.
Virtua: Ha egy metódut virtuálisnak nyilvánítunk, az virtuális metódus, amíg nem használjuk a ClassName változót = új ClassName(); Mielőtt egy osztály példányát meghirdetnénk, az nem létezik a valós memóriatérben. Ezt a kulcsszót nagyon gyakran használják az osztályöröklődésben, hogy polimorfizmus támogatást nyújtsanak az osztály metódusokhoz.
felülírás: átírást jelez Ez az osztály a Shape osztályból öröklik A virtual, abstract az, hogy elmondom azoknak az osztályoknak, akik örökölni akarnak tőle, hogy felülírhatod ezt a módszeremet vagy tulajdonságomat, különben nem engedélyezett. Kivonat: Az absztrakt metódus deklarációja egy olyan metódus, amelyet egy származtatott osztály felülír, amelyet örökléshez használnak; Ez egy képzeletbeli módszernek tekinthető megvalósítás nélkül; Ha egy osztály tartalmaz absztrakt metódust, akkor az osztályt absztrakt osztályként kell definiálni, függetlenül attól, hogy tartalmaz más általános metódusok is; Az absztrakt osztályoknak nem lehetnek anyagai.
a) A virtuális módosítás módszerének kell lennie egy módszermegvalósítással (még akkor is, ha csak pár fogszabályzóról van szó), és az absztrakt módosítás módszerének nem lehet megvalósítása.
b) a virtuális alosztályok által újraírható, az absztraktot alosztályok is újra kell írni.
c) Ha egy függvényt az osztályban abstact módosít, akkor az osztálynevet is abstacttal kell módosítani
d) Absztrakt módosított osztályokat nem lehet létrehozni példányként.
e) Ha egy C#-ban lévő metódus készen áll arra, hogy átírja az alosztály szülőosztályát, a módszert a szülő osztályban virtuális osztályban kell módosítani, és felül kell írni az alosztályban, elkerülve, hogy a programozó véletlenül újraírja az alosztály szülő metódusát.
Megjegyzés: Az absztrakt osztályokat csak örökölhetik, nem instanciálni.
2. értelmezés
Mind a virtual, mind az absztrakt osztály módosítására szolgál, lehetővé téve a gyermekosztály újradefiniálását azáltal, hogy felülírja a szülőosztály definícióját.
Egy közös vonásuk van: ha metódusokat módosítanak, akkor a nyilvános jelölést kell hozzáadni eléjük, különben fordítási hibák lesznek: a virtuális vagy absztrakt metódok nem lehetnek privátok. Végül is a virtuális vagy absztrakt hozzáadás lehetővé teszi az alosztály újradefiniálását, és a privát tagok nem férhetnek hozzá az alosztály által.
De nagyon különbözőek. (a virtuális "virtual", az absztrakt "absztrakt").
(1) A virtuális módosítás módszerét meg kell valósítani (még akkor is, ha csak pár fogszabályzót ad hozzá), míg az absztrakt módosítás módszerét nem szabad megvalósítani. Például, ha a virtuális módosítás módszere nem valósul meg:
Hiba: "Test1.fun1()" a testet kell bejelentenie, mert nem van absztrakt, külső vagy részleges jelöléssel
Absztrakt módosítók esetén, ha megvalósítják:
Hiba: "Test2.fun2()" nem tudja a testet bejelenteni, mert absztraktként van jelölve
(2) a virtuális alosztályok által újraírható, míg az absztraktot alosztályok újra kell írni.
A fordításban nincs hiba, ha a virtuális módosító metódusát újraírják, felülírást kell hozzáadni előtte (ami jelzi a fordítónak, hogy át akarod írni a virtuális metódust), és szükség van megvalósításra, különben a fordítás hibás lesz:
(3) Ha egy osztálytagot az absztrakt módosít, akkor az osztály előtt be kell adni az absztrakt osztályt, mert csak az absztrakt osztályoknak lehetnek absztrakt metódusok.
(4) Absztrakt osztályok példányai nem hozhatók létre, csak örökölhetők és nem instanciálhatók, például: BaseTest2 base2 = új BaseTest2(); Fordítási hiba következik: Az absztrakt osztály vagy interfész nem tud példányt létrehozni.
(5) C#-ban, ha egy metóduszot szeretnél újraírni egy alosztályban, akkor a szülőmetódus előtt virtuális módszert kell hozzáadnod, és felülírni kell az alosztály metódus előtt, hogy elkerüljük, hogy a programozók véletlenül újraírják az anyi metódust az alosztályban.
(6) Az absztrakt metódusot felül kell írni, és a virtuális metódusnak implementációval kell rendelkeznie (még akkor is, ha az absztrakt osztályban definiált metódus).
3. értelmezés Hasonlóságok: 1. Mind örökölhetők 2. Egyik sem instantizálható 3. Tartalmazhat metódus kijelentéseket 4. A származtatott osztályoknak meg kell valósítaniuk a nem megvalósuló módszereket Megkülönböztet: 1. Az absztrakt alaposztályok definiálhatják a mezőket, attribútumokat és metódusmegvalósításokat. Az interfészek csak attribútumokat, indexelőket, eseményeket és metódus deklarációkat definiálhatnak, és nem tartalmazhatnak mezőket. 2. Az absztrakt osztály egy hiányos osztály, amelyet tovább finomítani kell, míg az interfész viselkedési norma. A Microsoft egyedi interfészei mindig rendelkeznek egy alkalmas mezővel, amely bizonyítja, hogy azok a "Meg tudom csinálni..." kifejezéseket. ” 3. Az interfészek többször is megvalósíthatók, és az absztrakt osztályokat csak egyetlen személy örökölheti 4. Az absztrakt osztályok jobban definiáltak egy szorosan kapcsolódó osztályok között, míg a legtöbb interfész lazán kapcsolódik, de mindegyik egy adott függvényt valósít meg 5. Az absztrakt osztályok olyan fogalmak, amelyeket egy sor kapcsolódó objektumból vonnak össze, így tükrözik a dolgok belső egységességét; Az interfész egy funkcionális konvenció, amely külső hívásokat kielégít, így tükrözi a dolgok külső jellemzőit 6. Az interfésznek gyakorlatilag nincsenek konkrét öröklődési jellemzői, csak egy módszert ígér, amit lehet hívni 7. Az interfész visszahívások támogatására használható, de az öröklődés nem rendelkezik ezzel a funkcióval 8. Az absztrakt osztályok által megvalósított konkrét metódusok alapértelmezés szerint virtualisok, de az interfész megvalósító osztályban lévő interfész metódusok alapértelmezetten nem virtualisok, természetesen virtuális is lehet őket hirdetni 9. Ha az absztrakt osztály implementálja az interfészt, akkor az interfészben lévő metódus leképezhető az absztrakt osztályra absztrakt metódusként anélkül, hogy implementálni kellene, de a felületben lévő metódus megvalósítható az absztrakt osztály alosztályában Használati szabályok: 1. Az absztrakt osztályokat főként szorosan kapcsolódó objektumokhoz használják, míg az interfészek leginkább általános funkcionalitást biztosítanak irreleváns osztályokhoz 2. Ha nagy funkcionális egységet szeretnél tervezni, használj absztrakt osztályokat; Ha kis, tömör funkcionális blokkokat szeretnél tervezni, használj interfészeket. 3. Ha több komponens verziót várnak létrehozni, hozz létre egy absztrakt osztályt. Ha egyszer létrejött egy interfész, azt nem lehet megváltoztatni. Ha új interfész verzióra van szükség, teljesen új interfészt kell létrehozni. 4. Ha a létrehozott függvényt széles heterogén objektumok között fogják használni, használjuk az interfészt; Ha minden komponens megvalósításában közös megvalósított funkcionalitást szeretnél biztosítani, használj absztrakt osztályokat. 5. Elemzed az objektumot, finomítsd a belső egységességet, hogy egy absztrakt osztályt alkossanak, amely az objektum lényegét, azaz "mit" fejezi ki. Az interféseket akkor helyezik előtérbe, amikor külső hívásokat vagy funkciókat kell bővíteni 6. Egy jó interfészdefiníciónak specifikusnak és funkcionálisnak kell lennie, nem többfunkciósnak, különben interfész szennyezést okoz. Ha egy osztály csak az interfész egyik funkcióját valósítja meg, de más módszereket is meg kell valósítania az interfészben, azt interfész szennyezésnek nevezik 7. Próbáld meg elkerülni az öröklődést a formációs funkció eléréséhez, de használj fekete doboz multiplexelést, vagyis objektumkombinációt. Az öröklődési szintek számának növekedése miatt a legközvetlenebb következménye, hogy amikor egy osztályt hívsz ebben a taxonban, mindet be kell tölteni a verembe! A következmények elképzelhetők. (Kombinálva a stack elv megértésével). Ugyanakkor az érdeklődő barátok észrevehetik, hogy a Microsoft gyakran használja az objektumkombináció módszerét egy osztály építésekor. Például asp.net-ben a Page osztály olyan tulajdonságokkal rendelkezik, mint a Server Request, de valójában mindegyik egy adott osztály objektuma. A Page osztály ezen objektumának használata más osztályok metódusainak és tulajdonságainak meghívására nagyon alapvető tervezési elv Például: Az ablakformák absztrakt osztályokkal tervezhetők, a nyilvános műveletek és tulajdonságok pedig elhelyezhetők egy absztrakt osztályba, így az űrlap és a párbeszédablak örökölheti ezt az absztrakt osztályt, majd saját igényeik szerint bővíthetik és fejleszthetik.
A nyomtatási művelet minden űrlap számára interfészként szolgálhat, amely erre a funkcióra van szükség, mert a forma tartalma eltérő, és saját nyomtatási funkciót kell saját igényeik szerint megvalósítaniuk. Nyomtatáskor csak az interfészen keresztül hívják, függetlenül attól, hogy melyik formát nyomtatják.
Közös vonások, egyéniség és választás: Néhány könyv szerint a C# az interfészek használatát javasolja absztrakt alaposztályok helyett, és hangsúlyozza az interfészek használatának számos előnyét, amelyekkel nem merek vitatkozni; a fenti lista alapján még mindig sok különbség van a kettő között, és ennek a különbségnek a lehetőségei meghatározzák az alkalmazható helyzetek közötti különbséget, például az absztrakt alaposztály alapértelmezett megvalósítást biztosíthat bizonyos metódusokhoz, hogy elkerüljék az ismétlődő megvalósításukat alosztályokban, és javítsák a kód újrahasználhatóságát. Ez az absztrakt osztályok előnye; Az interfész csak absztrakt metódusokat tartalmazhat. Ami az absztrakt alaposztályokat és az interfészeket illeti, attól függ, hogyan látják a felhasználók az örökölt osztályok közötti kapcsolatokat, hogy személyiségkülönbségek vagy közös kapcsolatok azok a közöttük. Hadd illusztráljam egy életpéldával.
Ha három tárgyat kapsz, nevezetesen embereket, halakat és békákat, és megkérnek, hogy tervezz egy alapkategóriát számukra, hogy összefoglald a kapcsolatot, akkor az első dolog, amit érezni fogsz, hogy nagy különbségek vannak közöttük, és nehéz elvonni a közös vonásokat. Itt érdemes megfontolni az interfészek használatát absztrakt alaposztályok helyett három okból:
1. Az egyéniség nagyobb, mint a közös alkalma. 2. A nagy különbségű személyiségek hasonló viselkedést mutatnak. 3. Nagy különbségek vannak ugyanazon viselkedés megvalósítási módszereiben. Ekkor még három objektumot kapsz, nevezetesen keresztező pontyot, pontyt és aranyhalat, és még mindig alaposztályokat tervezhetsz, hogy összefoglald a köztük lévő kapcsolatot, az első dolog, amit ráveszel, hogy mind a halokhoz tartoznak, a második, hogy az úszás módja kissé eltérhet a viselkedésük, ezért absztrakt alaposztályokat kell használni interfészek helyett, a fenti példához képest három oka van:
1. A közös egység nagyobb, mint az egyéniség 2. Az azonos közös tulajdonsággal rendelkező egyéneknek ugyanazokkal a tulajdonságokkal és viselkedésekkel kell rendelkezniük 3. Bizonyos eltérések vannak ugyanazon viselkedés megvalósítási módszereiben Az interfészek vagy absztrakt alaposztályok használatára szolgáló több ok közül a harmadik ok valójában ugyanaz, amely leírja a polimorfizmus fogalmát az objektumorientált rendszerben, vagyis úgy valósítják meg, hogy felülírja az anyaosztályt, és a megfelelő metódust futásidőben meghívja az átadott objektumhivatkozás alapján. A második ok elkezd eltérni, az interfészek ugyanazt a viselkedést hangsúlyozzák az örökölt objektumok között, míg az absztrakt osztályok ugyanazokat a tulajdonságokat hangsúlyozzák az örökölt objektumok között. Ami igazán megkülönbözteti a felületeket az absztrakt alaposztályoktól, az a következő okok:
Az interfészeket akkor használják, amikor funkcionális közös egységet keresnek a nagy különbségekkel rendelkező objektumok között. Az absztrakt alaposztályokat akkor használják, amikor funkcionális különbségeket keresnek a nagyobb egységű objektumok között. Ha ugyanazokat és különbözőeket hasonlítjuk össze, csak annyit mondhatunk, hogy az interfészeknek és az absztrakt osztályoknak megvannak a saját erősségeik, de nincs előnye. A tényleges programozási gyakorlatban a tehetségünket a konkrét helyzet szerint kell mérnünk, de a következő tapasztalatok és felhalmozódás inspirációt adhat, és a saját felhalmozódásom mellett sok a klasszikusokból származik, úgy hiszem, kibírják a próbát. Tehát a szabályokban és alkalmakban tanuljuk meg ezeket a klasszikusokat, a legfontosabb, hogy alkalmazzuk, amit tanultunk, természetesen mindenki nevetését elnyerem egy család szavaival, kérlek, folytasd.
Szabályok és alkalomok: 1. Ne feledd, hogy az objektumorientált gondolkodás egyik legfontosabb elve: interfész-orientált programozás. 2. Interfészek és absztrakt osztályok segítségével a 23 tervezési minta számos ötletét okosan megvalósították, és szerintem lényegük egyszerűen az, hogy az absztrakt programozásra irányulnak. 3. Az absztrakt osztályokat főként szorosan kapcsolódó objektumokhoz kell használni, míg az interfészeket leginkább az irreleváns osztályok általános funkcióinak biztosítására használják. 4. Az interfész a CAN-DO kapcsolattípusra fókuszál, míg az absztrakt osztály az IS-A kapcsolatra. 5. A többdefiniált objektumok viselkedése az interfészben; az absztrakt osztályok többszörösen definiálják az objektumok tulajdonságait; 6. Az interfész definíciói használhatnak nyilvános, védett, belső és privát módosítókat, de szinte minden interfész nyilvánosnak van definiálva, így nincs szükség arra, hogy többet mondanunk. 7. "Az interfész változatlan marad" fontos tényező, amelyet figyelembe kell venni. Ezért interfészekből való kiterjesztések hozzáadásakor új interfészeket kell hozzáadni, nem pedig meglévő interfészeket. 8. Próbáld meg megtervezni az interfészt egy funkcionális blokkká egyetlen funkcióval, például a .NET Framework-et, az IDisposable, IDisposable, IComparable, IEquatable, IEnumerable stb. mind egyetlen közös módszert tartalmaznak. 9. Az interfész neve előtti nagybetű "I" egy konvenció, ahogy a mező neve aláhúzással kezdődik, kérjük, tartsa be ezeket az elveket. 10. Az interfészben minden metódus alapértelmezetten nyilvánosra vált. 11. Ha verzióproblémák várhatók, létrehozhatsz egy "absztrakt osztályt". Például, ha kutyát, csirkét és kacsát alkotsz, érdemes megfontolnod az állatok absztrakcióját a jövőben felmerülő problémák kezelésére. Új tagok hozzáadása az interfészhez minden származtatott osztályt módosítani és újrafordítani kell, így a verziókészítési problémákat legjobban absztrakt osztályokkal lehet megvalósítani. 12. Az absztrakt osztályokból származtatott nem absztrakt osztályoknak tartalmazniuk kell az összes örökölt absztrakt metódust és az absztrakt accessorok tényleges megvalósítását. 13. Az új kulcsszó nem használható absztrakt osztályokhoz, és nem pecsételhető, mert az absztrakt osztályokat nem lehet megvalósítani. 14. Statikus vagy virtuális módosítók nem használhatók absztrakt metódus deklarációkban.
|