Suositeltava, 2024

Toimituksen Valinta

Ero Interface ja Abstract Class välillä Java & C #

Interface ja Abstract-luokan molemmat edistävät "epätäydellistä tyyppiä" OOP: ssa. Joskus tarvitsemme superklassin, jonka avulla määritellään "mitä tehdä", mutta ei "miten tehdä", miten osaa toteutetaan johdetun luokan tarpeiden mukaan, " käyttöliittymä " tarjoaa ratkaisun tähän. Joskus tarvitsemme superklassiluokan, joka määrittelee jonkinlaisen yleistetyn rakenteen, joka voidaan toteuttaa johdetuilla luokilla ja jokin määritelty rakenne, jota johdetut luokat voivat hyödyntää, " abstrakti luokka " tarjoaa ratkaisun tähän. Keskeinen ero käyttöliittymän ja abstraktin luokan välillä on, että liitäntä on täysin epätäydellinen ja abstrakti luokka on osittain epätäydellinen.

Vertailukaavio

Vertailun perusteetliitäntäAbstrakti luokka
perustiedotKun tiedät vain vaatimuksista sen täytäntöönpanosta, käytät käyttöliittymää.Kun tiedät osittain käytetyistä toteutuksista, "Tiivistysluokat".
menetelmätLiitäntä sisältää vain abstrakteja menetelmiä.Abstrakti luokka sisältää abstrakteja menetelmiä ja konkreettisia menetelmiä.
Menetelmien muokkaajaLiitä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 menetelmilleLiitä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 muuttujaanKä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 muuttujilleLiitäntämuuttujia ei voida julistaa yksityisiksi, suojattaviksi, ohimeneviksi, haihtuviksi.Abstraktien luokan muuttujien modifioijia ei ole rajoitettu.
Muuttujien alustusKäyttöliittymämuuttujat on alustettava ilmoituksen tekohetkellä.Ei ole pakollista, että abstraktit luokan muuttujat on alustettava ilmoituksen tekohetkellä.
Esimerkkejä ja staattisia lohkojaSisäinen käyttöliittymä, et voi ilmoittaa ilmentymää tai staattista lohkoa.Tiivistysluokka sallii sen sisällä olevan instanssin tai staattisen lohkon.
ConstructorsEt 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”.

Liitäntä on puhdas abstrakti luokka. Käyttöliittymän luomiseen käytetty avainsana on ”käyttöliittymä”. Koska kaikki sisäisen käyttöliittymän menetelmä on täysin abstrakti. Liitäntä määrittelee vain, mitä luokka pitää tehdä, mutta se ei määritä, miten se tekee sen. Vain siksi, että kaikki käyttöliittymän sisällä ilmoitettu menetelmä on abstrakti, rajapintaa varten ei luota mitään esimerkkiä. Java-käyttöliittymän yleinen muoto on:

 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 #

  1. 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.
  2. Liitännällä on kaikki menetelmät abstrakteja, mutta abstraktilla luokalla on joitakin abstrakteja menetelmiä ja joitakin konkreettisia menetelmiä.
  3. 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.
  4. Liitäntämenetelmä ei voi koskaan olla yksityinen, suojattu, lopullinen, staattinen, synkronoitu, natiivi tai rangefp. Toisaalta abstraktin luokan menetelmille ei ole rajoituksia.
  5. 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.
  6. Rajapinnan muuttujat eivät voi koskaan olla yksityisiä suojattuja tai haihtuvia, kun taas abstraktissa luokassa ei ole rajoituksia muuttujille.
  7. Käyttöliittymän muuttuja on alustettava ilmoituksen aikana. Toisaalta abstraktin luokan muuttujat voidaan alustaa milloin tahansa.
  8. 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ä.
  9. 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.

Top