Tulkinta 1
C#:ssa abstrakti ja virtuaalinen ovat hämmentäviä, molemmat liittyvät periytymiseen ja sisältävät ohituksen käyttöä. Keskustellaan näiden kahden eroista:
1. Virtuaalinen menetelmä
virtuaalista avainsanaa käytetään muokkaamaan metodeja perusluokassa. Virtuaalista käytetään kahta tilannetta:
Skenaario 1: Virtuaalinen metodi määritellään perusluokassa, mutta virtuaalimetodia ei kirjoiteta uudelleen johdetussa luokassa. Johdetun luokan instanssin kutsussa virtuaalinen metodi käyttää perusluokan määrittelemää metodia.
Skenaario 2: Virtuaalinen metodi määritellään perusluokassa ja sitten metodi kirjoitetaan uudelleen ohituksella johdetussa luokassa. Johdetun luokan instanssin kutsussa virtuaalinen metodi käyttää johdettua uudelleenkirjoitusmenetelmää.
2. Abstrakti menetelmä (abstrakti menetelmä)
Abstraktia avainsanaa voidaan käyttää vain abstrakteissa luokissa metodien muokkaamiseen, eikä sille ole olemassa erityistä toteutusta. Abstraktien metodien toteutus on toteutettava johdetussa luokassa ohitusavainsanalla.
Tärkein ero rajapinnan ja abstraktin luokan välillä: abstrakti luokka on epätäydellinen luokka, objektin abstraktio, kun taas rajapinta on käyttäytymisnormi.
3. Avainsanat
Staattinen: Kun metodi julistetaan staattiseksi, metodi on staattinen metodi ja kääntäjä säilyttää metodin toteutuksen käännösaikana. Toisin sanoen metodi kuuluu luokkaan, mutta ei mihinkään jäseneen, riippumatta siitä, onko luokan instanssi olemassa vai ei. Aivan kuten entry funktio Static void Main, koska se on staattinen funktio, sitä voidaan kutsua suoraan.
Virtua: Kun metodi julistetaan virtuaaliseksi, se on virtuaalinen metodi, kunnes käytät ClassName -muuttujaa = uusi ClassName(); Ennen luokan instanssin määrittelyä se ei ole olemassa todellisessa muistitilassa. Tätä avainsanaa käytetään hyvin yleisesti luokkaperinnössä tarjoamaan polymorfismitukea luokkametodeille.
overrride: ilmaisee uudelleenkirjoituksen Tämä luokka perii Shape-luokasta Virtuaalinen, abstrakti tarkoittaa kertoa muille luokille, jotka haluavat periä häneltä, että voit ohittaa tämän metodin tai ominaisuuteni, muuten se ei ole sallittua. Tiivistelmä: Abstrakti metodi-ilmoitus on metodi, joka täytyy ohittaa johdetulla luokalla, jota käytetään periytymiseen; Sitä voidaan pitää kuvitteellisen menetelmänä ilman toteutusta; Jos luokka sisältää abstraktin metodin, luokka on määriteltävä abstraktiksi luokaksi, riippumatta siitä, sisältääkö se muita yleisiä metodeja; Abstrakteilla luokilla ei voi olla substansseja.
a) Virtuaalisen muokkauksen metodilla täytyy olla metoditoteutus (vaikka se olisi vain pari tukiraudat), eikä abstraktin muokkauksen metodilla voi olla toteutusta.
b) virtuaalinen voidaan kirjoittaa uudelleen alaluokkien mukaan, tiivistelmä täytyy kirjoittaa uudelleen alaluokkien toimesta
c) Jos funktiota luokassa muutetaan abstactilla, myös luokan nimeä on muutettava abstactilla
d) Abstrakteja muokattuja luokkia ei voida luoda instansseina.
e) Jos C#:n metodi valmistellaan kirjoittamaan uudelleen emoluokan alaluokassa, metodia on muutettava virtuaalilla emoluokassa ja ylikirjoitettava aliluokassa, jotta ohjelmoija ei vahingossa kirjoita vanhempi metodia alaluokassa.
Huomautus: Abstraktilla muokatut luokat voidaan vain periä, ei instansoitua.
Tulkinta 2
Sekä virtuaalista että abstraktia käytetään emoluokan muokkaamiseen, jolloin lapsiluokka voidaan määritellä uudelleen ohittamalla vanhemman luokan määritelmä.
Niillä on yksi yhteinen piirre: jos niitä käytetään metodien muokkaamiseen, julkinen on lisättävä niiden eteen, muuten tulee käännösvirheitä: virtuaalimetodit tai abstraktit metodit eivät voi olla yksityisiä. Loppujen lopuksi virtuaalisen tai abstraktin lisääminen mahdollistaa aliluokan uudelleenmäärittelyn, eikä alaluokka voi käyttää yksityisiä jäseniä.
Mutta ne ovat hyvin erilaisia. (virtuaali on "virtuaalinen", abstrakti on "abstrakti").
(1) Virtuaalisen muokkauksen menetelmä on toteutettava (vaikka siihen lisättäisiin vain pari tukia), kun taas abstraktin muokkauksen menetelmää ei saa toteuttaa. Esimerkiksi, jos virtuaalisen muokkauksen menetelmää ei toteuteta:
Virhe: "Test1.fun1()" täytyy ilmoittaa kappale, koska sitä ei ole merkitty abstraktiksi, ulkoiseksi tai osittaiseksi
Abstrakteille muokkaimille, jos ne toteutetaan:
Virhe: "Test2.fun2()" ei voi ilmoittaa kappaletta, koska se on merkitty abstraktiksi
(2) virtuaalinen voidaan kirjoittaa uudelleen alaluokkien avulla, kun taas tiivistelmä täytyy kirjoittaa uudelleen alaluokkien toimesta.
Kääntämisessä ei ole virhettä, jos virtuaalimodifikaattorin metodi kirjoitetaan uudelleen, ohitus täytyy lisätä sen eteen (joka kertoo kääntäjälle, että haluat kirjoittaa virtuaalisen metodin uudelleen), ja toteutus täytyy olla, muuten käännös on väärä:
(3) Jos luokan jäsentä muokataan abstraktilla, abstrakti on lisättävä ennen luokkaa, koska vain abstraktit luokat voivat sisältää abstraktit metodit.
(4) Abstraktien luokkien instansseja ei voida luoda, ne voidaan vain periä eikä niitä voi instansoitua, esimerkiksi: BaseTest2 base2 = uusi BaseTest2(); Käännösvirhe ilmenee: Abstrakti luokka tai rajapinta ei voi luoda instanssia.
(5) C#:ssa, jos haluat kirjoittaa metodin uudelleen aliluokassa, sinun täytyy lisätä virtuaalinen ennen vanhemman metodia ja ohittaa ennen aliluokkametodia, jotta ohjelmoijat eivät vahingossa kirjoita vanhempaa metodia alaluokassa.
(6) Abstrakti metodi on ylikirjoitettava, ja virtuaalimetodilla täytyy olla toteutus (vaikka se olisi abstraktissa luokassa määritelty metodi).
Tulkinta 3 Yhtäläisyydet: 1. Ne kaikki voivat periytyä 2. Yhtäkään niistä ei voi instansoitua 3. Se voi sisältää metodi-ilmoituksia 4. Johdettujen luokkien on toteutettava toteuttamattomia menetelmiä Erottaa: 1. Abstraktit perusluokat voivat määritellä kenttiä, attribuutteja ja metoditoteutuksia. Rajapinnat voivat määritellä vain attribuutteja, indeksaattoreita, tapahtumia ja metodimäärityksiä, eivätkä ne voi sisältää kenttiä. 2. Abstrakti luokka on keskeneräinen luokka, jota täytyy vielä tarkentaa, kun taas rajapinta on käyttäytymisnormi. Microsoftin räätälöidyissä käyttöliittymissä on aina kykyinen kenttä, joka todistaa, että ne ovat ilmentymiä "Minä pystyn siihen..." ” 3. Rajapinnat voidaan toteuttaa useita kertoja, ja abstraktit luokat voi periytyä vain yhdelle henkilölle 4. Abstraktit luokat määritellään paremmin sarjan läheisesti toisiinsa liittyvien luokkien välillä, kun taas suurin osa rajapinnoista on löyhästi yhteydessä toisiinsa, mutta kaikki toteuttavat tietyn funktion 5. Abstraktit luokat ovat käsitteitä, jotka on abstraktoitu sarjasta toisiinsa liittyviä objekteja, joten ne heijastavat asioiden sisäistä yhteisyyttä; Rajapinta on funktionaalinen konventio, joka on määritelty tyydyttämään ulkoiset kutsut, joten se heijastaa asioiden ulkoisia ominaisuuksia 6. Rajapinnalla ei käytännössä ole mitään erityisiä periytymisen ominaisuuksia, se lupaa vain menetelmän, jota voidaan kutsua 7. Rajapintaa voidaan käyttää takaisinkutsujen tukemiseen, mutta perinnössä tätä ominaisuutta ei ole 8. Abstraktien luokkien toteuttamat metodit ovat oletuksena virtuaalisia, mutta rajapinnan rajapintametodit, jotka toteuttavat rajapinnan, ovat oletuksena ei-virtuaalisia, tietenkin voit myös julistaa ne virtuaalisiksi 9. Jos abstrakti luokka toteuttaa rajapinnan, rajapinnan metodi voidaan kartoittaa abstraktiin luokkaan abstraktina metodina ilman, että sitä tarvitsee toteuttaa, mutta rajapinnan metodi voidaan toteuttaa abstraktin luokan aliluokassa Käyttösäännöt: 1. Abstrakteja luokkia käytetään pääasiassa läheisesti toisiinsa liittyville objekteille, kun taas rajapintoja käytetään parhaiten tarjoamaan yleistä toiminnallisuutta epäolennaisille luokille 2. Jos haluat suunnitella suuren funktionaalisen yksikön, käytä abstrakteja luokkia; Jos haluat suunnitella pieniä, ytimekkäitä toiminnallisia lohkoja, käytä rajapintoja. 3. Jos komponentista odotetaan luotavan useita versioita, luo abstrakti luokka. Kun käyttöliittymä on luotu, sitä ei voi muuttaa. Jos käyttöliittymästä tarvitaan uusi versio, on luotava täysin uusi käyttöliittymä. 4. Jos luotua funktiota käytetään laajan valikoiman heterogeenisten objektien välillä, käytä rajapintaa; Jos haluat tarjota yhteisen toteutetun toiminnallisuuden kaikissa komponentin toteutuksissa, käytä abstrakteja luokkia. 5. Analysoi objektia, tarkenna sisäinen yhteisyys abstraktiksi luokaksi, jota käytetään ilmaisemaan objektin olemusta, eli "mitä". Rajapinnat priorisoidaan, kun ulkoisia kutsuja tai toimintoja täytyy laajentaa 6. Hyvän rajapinnan määritelmän tulisi olla tarkka ja toimiva, ei monitoiminen, muuten se aiheuttaa rajapinnan saastumista. Jos luokka toteuttaa vain yhden rajapinnan funktion, mutta joutuu toteuttamaan muita menetelmiä rajapinnassa, sitä kutsutaan rajapinnan saastumiseksi 7. Yritä välttää periytymistä muodostelman saavuttamiseksi, mutta käytä mustan laatikon multiplexausta, eli objektien yhdistämistä. Koska perintötasojen määrä on kasvanut, suorimman seurauksen seurauksena on se, että kun kutsut luokan tässä taksonissa, sinun täytyy ladata ne kaikki pinoon! Seuraukset voidaan kuvitella. (Yhdistettynä pinoperiaatteiden ymmärtämiseen). Samaan aikaan kiinnostuneet ystävät huomaavat, että Microsoft käyttää usein objektien yhdistämismenetelmää luokkia rakentaessaan. Esimerkiksi asp.net Page-luokalla on ominaisuuksia kuten Server Request, mutta todellisuudessa ne ovat kaikki tietyn luokan objekteja. Tämän Page-luokan objektin käyttäminen muiden luokkien metodien ja ominaisuuksien kutsumiseen on hyvin perustavanlaatuinen suunnitteluperiaate Esimerkiksi: Ikkunalomakkeita voidaan suunnitella abstrakteilla luokilla, ja julkiset toiminnot ja ominaisuudet voidaan sijoittaa abstraktiin luokkaan, jolloin lomake ja valintaikkuna voivat periä tästä abstraktista luokasta ja laajentaa sekä parantaa omien tarpeidensa mukaan.
Tulostustoiminto voidaan tarjota rajapintana jokaiselle lomakkeelle, joka tarvitsee tämän toiminnon, koska lomakkeen sisältö on erilaista, ja niiden on toteutettava oma tulostustoimintonsa omien tarpeidensa mukaisesti. Tulostuksessa sitä kutsutaan vain rajapinnan kautta, riippumatta siitä, mitä muotoa tulostetaan.
Yhteisyys, yksilöllisyys ja valinta: Jotkut kirjat toteavat, että C# suosittelee rajapintojen käyttöä abstraktien perusluokkien sijaan, ja korostavat rajapintojen monia etuja, joista en uskalla olla eri mieltä; yllä olevasta listasta näiden kahden välillä on edelleen paljon eroja, ja tämän eron olemassaolo määrittää sovellettavissa tilanteissa, esimerkiksi abstrakti perusluokka voi tarjota oletustoteutuksia joillekin metodeille, jotta niiden toistuva toteutus osaluokissa vältetään ja koodin uudelleenkäytettävyys paranee. Tämä on abstraktien luokkien etu; Rajapinta voi sisältää vain abstrakteja metodeja. Mitä tulee siihen, milloin käyttää abstrakteja perusluokkia ja milloin rajapintoja, riippuu siitä, miten käyttäjät näkevät perintöluokkien väliset yhteydet, olivatko ne persoonallisuuseroja vai yhteisiä yhteyksiä niiden välillä. Annan esimerkin elämän esimerkillä.
Jos sinulle annetaan kolme kohdetta: ihmiset, kalat ja sammakot, ja sinua pyydetään suunnittelemaan niille peruskategoria tiivistääksesi niiden yhteyden, ensimmäinen asia, jonka tunnet, on että niiden välillä on suuria eroja, ja on vaikea abstraktoida yhteisiä piirteitä. Tässä kannattaa harkita rajapintojen käyttöä abstraktien perusluokkien sijaan kolmesta syystä:
1. Yksilöllisyys on suurempi kuin yhteisyys. 2. Persoonallisuudet, joilla on suuria eroja, omaavat joitakin samoja käyttäytymismalleja. 3. Saman käyttäytymisen toteutusmenetelmissä on suuria eroja. Tässä vaiheessa sinulle annetaan kolme muuta objektia, nimittäin ristikarppi, karppi ja kultakala, ja voit silti suunnitella perusluokkia tiivistääksesi niiden väliset yhteydet, ja ensimmäinen asia, jonka huomaat, on että ne kaikki kuuluvat kaloihin, ja toinen on, että niiden uintitapa voi olla hieman erilainen, joten sinun tulisi käyttää abstrakteja perusluokkia rajapintojen sijaan. Edellä mainittuun esimerkkiin verrattuna siihen on kolme syytä:
1. Yhteisyys on suurempi kuin yksilöllisyys 2. Yksilöillä, joilla on sama yhteinen piirre, tulee olla samoja ominaisuuksia ja käyttäytymistä 3. Saman käyttäytymisen toteutusmenetelmissä on tiettyjä eroja Useiden rajapintojen tai abstraktien perusluokkien käytön syiden joukossa kolmas syy on itse asiassa sama, joka kuvaa polymorfismin käsitettä olio-orientoidussa muodossa, eli se toteutetaan ohittamalla emoluokka ja kutsumalla vastaava metodi suoritusaikana ohitetun objektiviitteen mukaan. Toinen syy alkaa erottua, kun rajapinnat korostavat samaa käyttäytymistä perittyjen objektien välillä, kun taas abstraktit luokat korostavat samoja ominaisuuksia perittyjen objektien välillä. Se, mikä todella erottaa rajapinnat abstrakteista perusluokista, ovat seuraavat syyt:
Rajapintoja käytetään, kun haetaan toiminnallista yhteistä kohteiden välillä, joilla on suuria eroja. Abstrakteja perusluokkia käytetään, kun etsitään toiminnallisia eroja yhteisempien objektien välillä. Vertaamalla samaa ja erilaista voimme vain sanoa, että rajapinnoilla ja abstrakteilla luokilla on omat vahvuutensa, mutta etuja ei ole. Varsinaisessa ohjelmointiharjoituksessa meidän täytyy mitata lahjakkuutemme tilanteen mukaan, mutta seuraava kokemus ja kertyminen voi antaa sinulle inspiraatiota; lisäksi osa omasta kertymyksestäni tulee klassikkoista, uskon niiden kestävän testin. Joten säännöissä ja tilaisuuksissa, opimme näitä klassikoita, tärkeintä on soveltaa oppimaamme, tietenkin voitan kaikkien naurun perheen sanoilla, jatkakaa.
Säännöt ja tilaisuudet: 1. Muista, että yksi olio-orientoidun ajattelun tärkeimmistä periaatteista on: rajapinta-ohjelmointi. 2. Rajapintojen ja abstraktien luokkien avulla monet 23 suunnittelumallin ideat on kekseliäästi toteutettu, ja mielestäni niiden ydin on yksinkertaisesti siinä, että ne suuntautuvat abstraktiin ohjelmointiin. 3. Abstrakteja luokkia tulisi käyttää pääasiassa läheisesti toisiinsa liittyvissä olioissa, kun taas rajapintoja käytetään parhaiten tarjoamaan yleistä toiminnallisuutta epäolennaisille luokille. 4. Rajapinta keskittyy CAN-DO-suhdetyyppiin, kun taas abstrakti luokka keskittyy IS-A-suhteeseen. 5. Monimääriteltyjen objektien käyttäytyminen rajapinnassa; abstraktit luokat määrittelevät monimääritteisiä objektien ominaisuuksia; 6. Rajapinnan määrittelyt voivat käyttää julkisia, suojattuja, sisäisiä ja yksityisiä modifikaattoreita, mutta lähes kaikki rajapinnat määritellään julkisiksi, joten enempää ei tarvitse sanoa. 7. "Käyttöliittymä pysyy muuttumattomana" on tärkeä tekijä, joka tulisi ottaa huomioon. Siksi, kun lisätään laajennuksia rajapinnoista, tulisi lisätä uusia rajapintoja, ei olemassa olevia rajapintoja. 8. Yritä suunnitella rajapinta toiminnalliseksi lohkoksi, jossa on yksi funktio, ottaen esimerkiksi .NET Frameworkin, IDisposable, IDisposable, IComparable, IEquatable, IEnumerable jne. sisältävät kaikki vain yhden yhteisen metodin. 9. Käyttöliittymän nimen edessä oleva iso kirjain "I" on käytäntö, aivan kuten kentän nimi alkaa alaviivalla, noudata näitä periaatteita. 10. Käyttöliittymässä kaikki metodit ovat oletuksena julkisia. 11. Jos versio-ongelmia odotetaan, voit luoda "abstraktin luokan". Esimerkiksi, jos luot koiran, kanan ja ankan, kannattaa harkita eläinten abstraktointia selviytyäksesi tulevaisuudessa mahdollisista tilanteista. Uusien jäsenten lisääminen rajapintaan pakottaa kaikki johdetut luokat muokataviksi ja uudelleenkäännettäviksi, joten versioointiongelmat toteutetaan parhaiten abstrakteilla luokilla. 12. Abstrakteista luokista johdetut ei-abstraktit luokit sisältävät kaikki periytyvät abstraktit menetelmät ja abstraktien accessorien todelliset toteutukset. 13. Uutta avainsanaa ei voi käyttää abstrakteille luokille, eikä niitä voi sulkea, koska abstrakteja luokkia ei voi instanssioida. 14. Staattisia tai virtuaalisia modifikaattoreita ei saa käyttää abstrakteissa metodimäärityksissä.
|