Vertailukaavio
Vertailun perusteet | liitäntä | Abstrakti luokka |
---|---|---|
perustiedot | Kun tiedät vain vaatimuksista sen täytäntöönpanosta, käytät käyttöliittymää. | Kun tiedät osittain käytetyistä toteutuksista, "Tiivistysluokat". |
menetelmät | Liitäntä sisältää vain abstrakteja menetelmiä. | Abstrakti luokka sisältää abstrakteja menetelmiä ja konkreettisia menetelmiä. |
Menetelmien muokkaaja | Liitäntämenetelmät ovat aina "Julkinen" ja "Tiivistelmä", vaikka emme julista. Näin ollen se voidaan sanoa 100%, puhdas abstrakti luokka. | Ei ole pakollista, että abstraktin luokan menetelmä on julkinen ja abstrakti. Siinä voi olla myös konkreettisia menetelmiä. |
Rajoitettu modifikaattori menetelmille | Liitäntämenetelmää ei voida ilmoittaa seuraavilla muokkaajilla: Julkinen: Yksityinen ja Suojattu Tiivistelmä: lopullinen, staattinen, synkronoitu, natiivi, tiukka. | Abstraktin luokan muuttujan modifioijille ei ole rajoituksia. |
Pääsy muuttujien muuttujaan | Käyttöliittymämuuttujien sallittu Acess-muokkaaja ovat julkisia, staattisia ja lopullisia riippumatta siitä, ilmoittaako tai ei. | Abstraktin luokan muuttujien ei tarvitse olla julkisia, staattisia, lopullisia. |
Rajoitetut muuttujat muuttujille | Liitäntämuuttujia ei voida julistaa yksityisiksi, suojattaviksi, ohimeneviksi, haihtuviksi. | Abstraktien luokan muuttujien modifioijia ei ole rajoitettu. |
Muuttujien alustus | Käyttöliittymämuuttujat on alustettava ilmoituksen tekohetkellä. | Ei ole pakollista, että abstraktit luokan muuttujat on alustettava ilmoituksen tekohetkellä. |
Esimerkkejä ja staattisia lohkoja | Sisäinen käyttöliittymä, et voi ilmoittaa ilmentymää tai staattista lohkoa. | Tiivistysluokka sallii sen sisällä olevan instanssin tai staattisen lohkon. |
Constructors | Et voi julistaa rakennuttajan sisäistä käyttöliittymää. | Voit julistaa rakentajan abstraktin luokan sisällä. |
Liitännän määritelmä
Java ei salli useita perintöjä. Toisin sanoen yksi luokka ei voi periä useampaa kuin yhtä luokkaa kerrallaan. Syy tähän voidaan selittää esimerkillä. Oletetaan, että meillä on kaksi vanhemmaluokkaa, A ja B ja johdettu luokka C. Johdettu luokka C perii sekä luokat A että B. Nyt molemmilla on A- ja B-luokan menetelmät (), niin se on kysymys luokan C osalta, mikä luokan periytyy. Ratkaisu tähän ongelmaan on ”rajapinta”.
access_specifier- käyttöliittymän käyttöliittymän_nimi {paluu-tyyppinen menetelmä-nimi1 (parametriluettelo); paluu-tyyppinen menetelmä-nimi2 (parametriluettelo); tyyppi final-varname1 = arvo; tyyppi final-varname2 = arvo; // ... palautustyyppinen menetelmä-nimiN (parametriluettelo); tyyppi final-varnameN = arvo; }
Pääsyn määrittelijä julistetaan julkiseksi, koska luokkien on toteutettava käyttöliittymä.
Meillä ei ole "Interface" -konseptia C ++: ssa. Mutta Java ja C # määrittävät käyttöliittymän hyvin.
Liitäntä Java:
- Käyttöliittymän muuttujat ovat oletusarvoisesti aina julkisia, staattisia ja lopullisia.
- Muuttujat on alustettava ilmoituksen tekohetkellä.
- Muuttujia ei voida koskaan julistaa yksityisiksi, suojattaviksi, ohimeneviksi ja haihtuviksi.
- Käyttöliittymän menetelmät ovat aina julkisia ja abstrakteja, kun taas niitä ei voida koskaan julistaa yksityisiksi, suojattaviksi, lopullisiksi, staattisiksi, synkronoiduiksi, alkuperäisiksi ja tiukkoiksi.
- Et voi julistaa mitään rakennuttajan sisäistä käyttöliittymää, koska rakentajan päätarkoitus on luokan muuttujien alustus, mutta rajapintamuuttujat alustetaan ilmoituksen tekohetkellä.
- Liitäntä voi periä muita rajapintoja, mutta tällaista rajapintaa käyttävän luokan on toteutettava kaikkien perittyjen rajapintojen menetelmät.
- Luokka voi periä useamman kuin yhden käyttöliittymän kerrallaan, ja sen on toteutettava kaikki perinnöllisten rajapintojen kaikki menetelmät.
Yleinen käyttöliittymän toteutusmuoto Java:
luokan luokan_nimi toteuttaa Interface_name {// class-body}
Käyttöliittymän perintää varten luokka käyttää avainsanaa "toteuttaa", ja luokka toteuttaa kaikki perinnöllisen käyttöliittymän ilmoittaman menetelmän.
Liitäntä C #: ssa:
C # -liitäntä on lähes samanlainen kuin Java-käyttöliittymä paitsi:
- C # -liitäntä ei ilmoita muuttujia.
- Käyttöliittymän nimi on etusijalla pääomalla I ja periytyy kaksoispisteellä (:).
Käyttöliittymän yleinen muoto C #: ssä:
luokan luokan_nimi: käyttöliittymän_nimi {// class-body}
Tiivistelmäluokan määritelmä
Luokka, joka sisältää yhden tai useampia abstrakteja menetelmiä, on nimeltään abstrakti luokka, ja luokka julistetaan abstraktiksi käyttämällä avainsanaa ”abstrakti”, jota edeltää luokan ”avainsana” luokan ilmoituksen alussa. Koska abstrakti luokka sisältää abstraktin menetelmän, se muodostaa epätäydellisen tyypin. Näin ollen et voi luoda abstraktin luokan kohteita. Aina kun luokka perii abstraktin luokan, sen täytyy toteuttaa kaikki abstraktin luokan abstraktit menetelmät, jos se ei ole niin, että se on myös julistettava abstraktiksi.
Abstrakti luokka voi sisältää myös konkreettisia menetelmiä, joita johdettu luokka voi hyödyntää sellaisenaan. Mutta abstraktin luokan sisällä ei voi julistaa abstraktia rakentajaa tai abstraktia staattista menetelmää. Java-abstraktin luokan yleinen muoto on seuraava:
abstrakti luokan luokan_nimi {abstrakti menetelmä_nimi1 (); abstrakti menetelmä_nimi2 (); : return_type method_name3 (parametri_list) {// konkreettinen menetelmä} return_type method_name4 (parametri_list) {// konkreettinen menetelmä}};
Abstraktin luokan käsite on samankaltainen sekä Java- että C #: ssä. Abstrakti luokka on hieman erilainen C ++: ssa.
C ++: ssa, jos luokassa on ainakin yksi virtuaalitoiminto, luokka muuttuu abstraktiksi luokaksi. Avainsanan ”abstrakti” sijasta avainsana ”virtuaalinen” käytetään julistamaan abstrakti menetelmä.
Keskeiset erot käyttöliittymän ja abstraktin luokan välillä Java & C #
- Kun tiedät "mitä tarvitaan", mutta ei "miten se toteutetaan", on käytettävä käyttöliittymää. Toisaalta, jos tiedät, mitä tarvitaan ja osittain tiedät, miten se toteutetaan, käytä abstrakteja luokkia.
- Liitännällä on kaikki menetelmät abstrakteja, mutta abstraktilla luokalla on joitakin abstrakteja menetelmiä ja joitakin konkreettisia menetelmiä.
- Liitännän sisäiset menetelmät ovat julkisia ja abstrakteja, joten niitä kutsutaan myös puhtaiksi abstrakteiksi luokiksi. Toisaalta abstraktin sisäiset menetelmät eivät rajoitu pelkästään julkisiin ja abstrakteihin.
- Liitäntämenetelmä ei voi koskaan olla yksityinen, suojattu, lopullinen, staattinen, synkronoitu, natiivi tai rangefp. Toisaalta abstraktin luokan menetelmille ei ole rajoituksia.
- Rajapinnan muuttujat ovat julkisia ja lopullisia riippumatta siitä, julistammeko heitä vai ei, kun taas abstraktin luokan muuttujiin ei ole tällaista rajoitusta olla julkisia ja lopullisia.
- Rajapinnan muuttujat eivät voi koskaan olla yksityisiä suojattuja tai haihtuvia, kun taas abstraktissa luokassa ei ole rajoituksia muuttujille.
- Käyttöliittymän muuttuja on alustettava ilmoituksen aikana. Toisaalta abstraktin luokan muuttujat voidaan alustaa milloin tahansa.
- Käyttöliittymän sisällä ei ole mahdollista ilmoittaa ilmentymää tai staattista lohkoa, mutta voit julistaa esimerkiksi tai staattisen lohkon abstraktin luokan sisällä.
- Et voi määritellä rakentajaa rajapinnan sisällä, mutta voit määrittää konstruktorin abstraktin luokan sisällä.
johtopäätös:
Kun sinun on luotava perusluokka, joka sisältää yleistetyn menetelmän muodon, jonka johdetut luokat voivat toteuttaa tarpeen mukaan, käyttöliittymän ja abstraktin luokan käsite auttaa näin.