Programmēšana

Kad izmantot abstraktu klasi un saskarni C #

Veidojot lietojumprogrammas, ir svarīgi zināt, kad jāizmanto abstraktā klase un kad - interfeiss. Lai gan abstraktās klases un saskarnes dažos aspektos šķiet līdzīgas, pastāv būtiskas atšķirības, kas noteiks labāko izvēli tam, ko jūs mēģināt paveikt. Šajā emuāra ziņā es apspriedīšu šīs atšķirības un to, kā izlemt, kad kuru izmantot.

Īsā atbilde: abstraktā klase ļauj jums izveidot funkcionalitāti, kuru apakšklases var ieviest vai ignorēt. Interfeiss ļauj definēt tikai funkcionalitāti, nevis to ieviest. Tā kā klase var paplašināt tikai vienu abstraktu klasi, tā var izmantot vairākas saskarnes.

C # abstraktā klase paskaidrota

Abstrakta klase ir īpašs klases tips, kuru nevar instantizēt. Abstraktā klase ir paredzēta mantošanai apakšklasēs, kuras vai nu ievieš, vai ignorē tās metodes. Citiem vārdiem sakot, abstraktās klases tiek vai nu daļēji ieviestas, vai arī netiek vispār ieviestas. Abstraktajā klasē jums var būt funkcionalitāte - metodes abstraktā klasē var būt gan abstraktas, gan konkrētas. Abstraktai klasei var būt konstruktori - tā ir viena būtiska atšķirība starp abstraktu klasi un saskarni. Jūs varat izmantot abstrakto klašu priekšrocības, lai noformētu komponentus un norādītu kādu kopējas funkcionalitātes līmeni, kas jāievieš atvasinātajām klasēm.

C # interfeiss paskaidrots

Saskarne būtībā ir līgums - tai nav nekādas ieviešanas. Saskarne var saturēt tikai metožu deklarācijas; tajā nevar būt metožu definīcijas. Interfeisā nevar būt arī biedru datu. Abstraktā klasē var būt metožu definīcijas, lauki un konstruktori, bet saskarnē var būt tikai notikumu, metožu un īpašību deklarācijas. Interfeisā deklarētās metodes jāievieš klasēm, kuras ievieš saskarni. Ņemiet vērā, ka klase var ieviest vairākas saskarnes, bet paplašināt tikai vienu klasi. Klasei, kas ievieš saskarni, jāievieš visi tās dalībnieki. Tāpat kā abstrakta klase, saskarni nevar instantizēt.

Vai man vajadzētu izmantot abstraktu klasi vai saskarni?

Abstraktās klases sniedz jums elastību izmantot noteiktas konkrētas metodes un dažas citas metodes, kas jāievieš atvasinātajām klasēm. Turpretī, ja izmantojat saskarnes, jums būs jāievieš visas klases metodes, kas paplašina saskarni. Abstrakta klase ir laba izvēle, ja jums ir plāni nākotnes paplašināšanai - t.i., ja klases hierarhijā, visticamāk, ir iespējama turpmāka paplašināšanās. Ja vēlaties izmantot saskarņu atbalstu paplašināšanai nākotnē, interfeiss jāpaplašina un jāizveido jauns.

Ja nepieciešams, hierarhijā ir viegli pievienot jaunu saskarni, ja nepieciešams. Tomēr, ja jūsu hierarhijā jau ir abstrakta klase, jūs nevarat pievienot citu - t.i., jūs varat pievienot abstraktu klasi tikai tad, ja tādas nav pieejamas. Jums vajadzētu izmantot saskarni, ja vēlaties līgumu par kādu uzvedību vai funkcionalitāti. Jums nevajadzētu izmantot saskarni, ja saskarnes metodēm ir jāraksta tas pats kods. Šajā gadījumā jums vajadzētu izmantot abstraktu klasi, vienreiz definēt metodi un pēc vajadzības to atkārtoti izmantot. Izmantojiet saskarnes, lai atdalītu lietojumprogrammas kodu no konkrēta tā ieviešanas vai ierobežotu piekļuvi noteikta veida dalībniekiem.

Kā norādīts Microsoft saskarņu dokumentācijā:

Izmantojot saskarnes, varat, piemēram, klasē iekļaut uzvedību no vairākiem avotiem. Šī spēja ir svarīga C #, jo valoda neatbalsta vairāku klašu mantošanu. Turklāt, ja vēlaties simulēt struktūru mantojumu, jums jāizmanto interfeiss, jo tie faktiski nevar tikt mantoti no citas struktūras vai klases.

Netieša un skaidra saskarnes ieviešana

Saskarnes var ieviest netieši vai tieši. Ļaujiet man paskaidrot, kā šīs divas ieviešanas atšķiras. Apsveriet saukto saskarni IBuzņēmumsLoģika.

publiskā saskarne IBusinessLogic

{

anulēt Inicializēt ();

}

Nosaukta šāda klase Biznesa loģika īsteno IBuzņēmumsLoģika interfeiss.

publiskā klase BusinessLogic: IBusinessLogic

{

public void Inicializēt ()

   {

// Daži kodi

   }

}

Jūs varat izveidot Biznesa loģika klasē un pēc tam piezvaniet Palaist() metodi, kā parādīts zemāk.

 IBusinessLogic businessLogic = jauns BusinessLogic ();

businessLogic.Initialize ();

Šis koda fragments parāda, kā jūs varat ieviest IBuzņēmumsLoģika interfeiss netieši.

publiskā klase BusinessLogic: IBusinessLogic

{

anulēt IBusinessLogic. Inicializēt ()

   {

   }

}

Tagad jūs varat izmantot Palaist() metodi tāpat, izmantojot atsauci uz IBuzņēmumsLoģika interfeiss. Atšķirība abās pieejās ir tāda, ka, skaidri ieviešot saskarni savā klasē, jums ir jāizmanto sava interfeisa metode, izmantojot tikai atsauci uz interfeisu. Tāpēc šāds koda fragments nedarbosies, t.i., neapkopos.

 BusinessLogic businessLogic = jauns BusinessLogic ();

businessLogic.Initialize ();

Kā izdarīt vairāk C #:

  • Kad izmantot abstraktu klasi un saskarni C #
  • Kā strādāt ar AutoMapper C #
  • Kā lietot lambda izteicienus C #
  • Kā strādāt ar Action, Func un Predicate delegātiem C #
  • Kā strādāt ar delegātiem C #
  • Kā ieviest vienkāršu reģistrētāju C #
  • Kā strādāt ar atribūtiem C #
  • Kā strādāt ar log4net C #
  • Kā ieviest krātuves dizaina modeli C #
  • Kā strādāt ar refleksiju C #
  • Kā strādāt ar filesystemwatcher C #
  • Kā veikt slinku inicializāciju C #
  • Kā strādāt ar MSMQ C #
  • Kā strādāt ar paplašināšanas metodēm C #
  • Kā mums izteikt lambda izteicienus C #
  • Kad lietot svārstīgo atslēgvārdu C #
  • Kā izmantot ienesīguma atslēgvārdu C #
  • Kā ieviest polimorfismu C #
  • Kā izveidot savu uzdevumu plānotāju C #
  • Kā strādāt ar RabbitMQ C #
  • Kā strādāt ar dubultošanos C #
  • Virtuālu un abstraktu metožu izpēte C #
$config[zx-auto] not found$config[zx-overlay] not found