Ohjelmointi

Milloin abstraktia luokkaa vs. käyttöliittymää käytetään C #: ssä

Sovelluksia suunniteltaessa on tärkeää tietää, milloin abstraktia luokkaa ja milloin käyttöliittymää. Vaikka abstraktit luokat ja käyttöliittymät näyttävät joiltakin tavoin samanlaisilta, on tärkeimpiä eroja, jotka määrittävät, mikä on paras valinta saavutettavaksi. Tässä blogiviestissä keskustelen näistä eroista ja siitä, miten päättää, milloin käyttää mitä.

Lyhyt vastaus: Abstraktin luokan avulla voit luoda toimintoja, joita alaluokat voivat toteuttaa tai ohittaa. Käyttöliittymän avulla voit määrittää vain toiminnallisuuden, ei toteuttaa sitä. Ja vaikka luokka voi laajentaa vain yhtä abstraktia luokkaa, se voi hyödyntää useita rajapintoja.

C # abstrakti luokka selitetty

Abstrakti luokka on erityistyyppinen luokka, jota ei voida instantisoida. Abstrakti luokka on suunniteltu perimään alaluokissa, jotka joko toteuttavat tai ohittavat sen menetelmät. Toisin sanoen abstraktit luokat joko toteutetaan osittain tai niitä ei toteuteta lainkaan. Sinulla voi olla toimintoja abstraktissa luokassa - abstraktin luokan menetelmät voivat olla sekä abstrakteja että konkreettisia. Abstraktilla luokassa voi olla rakentajia - tämä on yksi merkittävä ero abstraktin luokan ja käyttöliittymän välillä. Voit hyödyntää abstrakteja luokkia komponenttien suunnittelussa ja määrittää jonkin tason yhteisiä toimintoja, jotka johdettujen luokkien on toteutettava.

C # -liitäntä selitetty

Käyttöliittymä on pohjimmiltaan sopimus - sitä ei voida toteuttaa. Käyttöliittymä voi sisältää vain menetelmäilmoituksia; se ei voi sisältää menetelmien määritelmiä. Liittymässä ei voi olla myöskään jäsentietoja. Abstrakti luokka voi sisältää menetelmien määritelmiä, kenttiä ja konstruktoreita, mutta rajapinnalla voi olla vain tapahtumien, menetelmien ja ominaisuuksien ilmoituksia. Rajapinnassa ilmoitetut menetelmät on toteutettava rajapinnan toteuttavien luokkien kanssa. Huomaa, että luokka voi toteuttaa useamman kuin yhden käyttöliittymän, mutta laajentaa vain yhtä luokkaa. Rajapinnan toteuttavan luokan tulisi toteuttaa kaikki jäsenet. Abstraktin luokan tavoin rajapintaa ei voida instantisoida.

Pitäisikö minun käyttää abstraktia luokkaa vai käyttöliittymää?

Abstraktit luokat tarjoavat sinulle joustavuuden saada tiettyjä konkreettisia menetelmiä ja joitain muita menetelmiä, jotka johdettujen luokkien tulisi toteuttaa. Sen sijaan, jos käytät rajapintoja, sinun on toteutettava kaikki luokan menetelmät, jotka laajentavat käyttöliittymää. Abstrakti luokka on hyvä valinta, jos sinulla on suunnitelmia tulevaa laajentumista varten - ts. Jos tuleva laajennus on todennäköisesti luokkahierarkiassa. Jos haluat tarjota tukea tuleville laajennuksille käyttöliittymiä käytettäessä, sinun on laajennettava käyttöliittymää ja luotava uusi.

Toisella nuotilla on helppo lisätä uusi käyttöliittymä hierarkiaan tarvittaessa. Jos hierarkiassasi on jo abstrakti luokka, et voi lisätä toista - ts. Voit lisätä abstraktin luokan vain, jos niitä ei ole käytettävissä. Käytä käyttöliittymää, jos haluat sopimuksen jostakin toiminnasta tai toiminnasta. Älä käytä käyttöliittymää, jos sinun on kirjoitettava sama koodi käyttöliittymämenetelmille. Tässä tapauksessa sinun tulisi käyttää abstraktia luokkaa, määritellä menetelmä kerran ja käyttää sitä uudelleen tarpeen mukaan. Käytä liitäntöjä irrottaaksesi sovelluksesi koodi tietyistä sen toteutuksista tai rajoita pääsy tietyntyyppisille jäsenille.

Kuten Microsoftin käyttöliittymiä koskevassa dokumentaatiossa todetaan:

Käyttöliittymien avulla voit esimerkiksi sisällyttää käyttäytymisen useista lähteistä luokassa. Tämä ominaisuus on tärkeä C #: ssä, koska kieli ei tue luokkien useita perintöjä. Lisäksi sinun on käytettävä käyttöliittymää, jos haluat simuloida rakenteiden perintöä, koska ne eivät voi periä toisesta rakenteesta tai luokasta.

Implisiittinen ja eksplisiittinen käyttöliittymän toteutus

Liitännät voidaan toteuttaa implisiittisesti tai eksplisiittisesti. Haluan selittää, miten nämä kaksi toteutusta eroavat toisistaan. Harkitse käyttöliittymää nimeltä IBusinessLogiikka.

julkinen käyttöliittymä IBusinessLogic

{

void Initialize ();

}

Seuraava luokka nimetty BusinessLogic toteuttaa IBusinessLogiikka käyttöliittymä.

julkinen luokka BusinessLogic: IBusinessLogic

{

public void Alusta ()

   {

// Joitakin koodeja

   }

}

Voit luoda BusinessLogic luokan nimenomaisesti ja soita sitten Alustaa() menetelmällä alla olevan kuvan mukaisesti.

 IBusinessLogic businessLogic = uusi BusinessLogic ();

businessLogic.Initialize ();

Seuraava koodinpätkä kuvaa, kuinka voit toteuttaa IBusinessLogiikka käyttöliittymä implisiittisesti.

julkinen luokka BusinessLogic: IBusinessLogic

{

mitätöi IBusinessLogic.Initialize ()

   {

   }

}

Voit nyt käyttää Alustaa() menetelmä samalla tavalla käyttämällä viittausta IBusinessLogiikka käyttöliittymä. Ero näissä kahdessa lähestymistavassa on se, että kun otat käyttöliittymän käyttöön nimenomaisesti luokassa, sinun on pakko käyttää käyttöliittymän menetelmää vain viittaamalla käyttöliittymään. Siksi seuraava koodinpätkä ei toimisi, eli ei kääntäisi.

 BusinessLogic businessLogic = uusi BusinessLogic ();

businessLogic.Initialize ();

Kuinka tehdä enemmän C #: ssä:

  • Milloin abstraktia luokkaa vs. käyttöliittymää käytetään C #: ssä
  • Kuinka työskennellä AutoMapperin kanssa C #: ssä
  • Kuinka käyttää lambda-lausekkeita C #: ssä
  • Kuinka toimia Action-, Func- ja Predicate-edustajien kanssa C #: ssä
  • Kuinka työskennellä C #: n edustajien kanssa
  • Kuinka toteuttaa yksinkertainen kirjaaja C #: ssä
  • Kuinka työskennellä attribuuttien kanssa C #: ssä
  • Kuinka työskennellä log4netin kanssa C #: ssä
  • Kuinka toteuttaa arkiston suunnittelumalli C #: ssä
  • Kuinka työskennellä heijastuksen kanssa C #: ssä
  • Kuinka työskennellä tiedostojärjestelmän katselijan kanssa C #: ssä
  • Kuinka tehdä laiska alustus C #: ssä
  • Kuinka työskennellä MSMQ: n kanssa C #: ssä
  • Kuinka työskennellä laajennusmenetelmien kanssa C #: ssä
  • Kuinka meille lambda-lausekkeet C #: ssä
  • Milloin haihtuvaa avainsanaa käytetään C #: ssä
  • Tuottoavainsanan käyttäminen C #: ssä
  • Kuinka toteuttaa polymorfismi C #: ssa
  • Kuinka rakentaa oma tehtävän ajastin C #
  • Kuinka työskennellä RabbitMQ: n kanssa C #: ssä
  • Kuinka työskennellä C #: n kanssa
  • Virtuaalisten ja abstraktien menetelmien tutkiminen C #: ssä