Kada koristiti apstraktnu klasu naspram sučelja u C #

Prilikom dizajniranja aplikacija važno je znati kada koristiti apstraktnu klasu, a kada sučelje. Iako se apstraktne klase i sučelja na neki način čine sličnima, postoje ključne razlike koje će odrediti koji je najbolji izbor za ono što pokušavate postići. U ovom blogu ću raspraviti o tim razlikama i kako odlučiti kada ću koristiti koje.

Kratki odgovor: Apstraktna klasa omogućuje vam stvaranje funkcionalnosti koju potklase mogu implementirati ili nadjačati. Sučelje vam omogućuje samo definiranje funkcionalnosti, a ne njezinu implementaciju. I dok klasa može proširiti samo jednu apstraktnu klasu, ona može iskoristiti više sučelja. 

Objašnjen C # sažetak klase

Apstraktna klasa je posebna vrsta klase koja se ne može instancirati. Apstraktna klasa dizajnirana je za nasljeđivanje podklasa koje ili implementiraju ili nadjačavaju njene metode. Drugim riječima, apstraktne se klase ili djelomično provode ili se uopće ne provode. Možete imati funkcionalnost u svojoj apstraktnoj klasi - metode u apstraktnoj klasi mogu biti i apstraktne i konkretne. Apstraktna klasa može imati konstruktore - to je jedna od glavnih razlika između apstraktne klase i sučelja. Apstraktne klase možete iskoristiti za dizajn komponenata i odrediti neku razinu zajedničke funkcionalnosti koju moraju implementirati izvedene klase.

Objašnjeno sučelje C #

Sučelje je u osnovi ugovor - nema nikakve implementacije. Sučelje može sadržavati samo deklaracije metoda; ne može sadržavati definicije metoda. U sučelju ne možete imati nikakve podatke o članu. Dok apstraktna klasa može sadržavati definicije metoda, polja i konstruktore, sučelje može imati samo deklaracije događaja, metoda i svojstava. Metode deklarirane u sučelju moraju implementirati klase koje implementiraju sučelje. Imajte na umu da klasa može implementirati više od jednog sučelja, ali proširiti samo jednu klasu. Klasa koja implementira sučelje trebala bi implementirati sve svoje članove. Poput apstraktne klase, sučelje se ne može instancirati.

Trebam li koristiti apstraktnu klasu ili sučelje?

Apstraktne klase pružaju vam fleksibilnost da imate određene konkretne metode i neke druge metode koje bi izvedene klase trebale implementirati. Suprotno tome, ako koristite sučelja, trebali biste implementirati sve metode u klasi koja proširuje sučelje. Apstraktna klasa dobar je izbor ako imate planove za buduće proširenje - tj. Ako je buduće proširenje vjerojatno u hijerarhiji razreda. Ako želite pružiti podršku za buduće proširenje prilikom upotrebe sučelja, morat ćete proširiti sučelje i stvoriti novo.

Ako je potrebno, u hijerarhiju je lako dodati novo sučelje. Međutim, ako već imate apstraktnu klasu u svojoj hijerarhiji, ne možete dodati drugu - tj. Apstraktnu klasu možete dodati samo ako nijedna nije dostupna. Trebali biste koristiti sučelje ako želite ugovor o određenom ponašanju ili funkcionalnosti. Ne biste trebali koristiti sučelje ako trebate napisati isti kôd za metode sučelja. U tom biste slučaju trebali koristiti apstraktnu klasu, jednom definirati metodu i po potrebi je ponovno upotrijebiti. Koristite sučelja za razdvajanje koda aplikacije od specifičnih njegovih implementacija ili za ograničavanje pristupa članovima određene vrste.

Kao što Microsoftova dokumentacija o sučeljima navodi:

Korištenjem sučelja možete, na primjer, uključiti ponašanje iz više izvora u klasi. Ta je sposobnost važna u C # jer jezik ne podržava višestruko nasljeđivanje klasa. Osim toga, morate koristiti sučelje ako želite simulirati nasljeđivanje za strukture, jer oni zapravo ne mogu naslijediti iz druge strukture ili klase.

Implicitne i eksplicitne implementacije sučelja

Sučelja se mogu implementirati implicitno ili eksplicitno. Dopustite mi da objasnim kako se te dvije implementacije razlikuju. Razmotrimo sučelje nazvano IBusinessLogic.

javno sučelje IBusinessLogic

{

   void Initialize ();

}

Sljedeća klasa imenovana BusinessLogicimplementira IBusinessLogicsučelje.

javna klasa BusinessLogic: IBusinessLogic

{

   javna praznina Initialize ()

   {

       // Neki kod

   }

}

Možete BusinessLogiceksplicitno stvoriti instancu klase, a zatim pozvati Initialize()metodu kao što je prikazano u nastavku.

 IBusinessLogic businessLogic = novi BusinessLogic ();

businessLogic.Initialize ();

Sljedeći isječak koda ilustrira kako možete IBusinessLogicimplicitno implementirati sučelje.

javna klasa BusinessLogic: IBusinessLogic

{

   void IBusinessLogic.Initialize ()

   {

   }

}

Sada se na Initialize()isti način možete pozvati na metodu koristeći referencu na IBusinessLogicsučelje. Razlika u dva pristupa je u tome što kada eksplicitno implementirate sučelje u svoju klasu, ograničeni ste na pozivanje metode vašeg sučelja koristeći samo referencu na sučelje. Stoga sljedeći isječak koda ne bi radio, tj. Ne bi se kompajlirao.

 BusinessLogic businessLogic = novi BusinessLogic ();

businessLogic.Initialize ();

Kako učiniti više u C #:

  • Kada koristiti apstraktnu klasu naspram sučelja u C #
  • Kako raditi s AutoMapperom u C #
  • Kako koristiti lambda izraze u C #
  • Kako raditi s delegatima Action, Func i Predicate u C #
  • Kako raditi s delegatima u C #
  • Kako implementirati jednostavni zapisnik u C #
  • Kako raditi s atributima u C #
  • Kako raditi s log4netom na C #
  • Kako implementirati obrazac dizajna spremišta u C #
  • Kako raditi s refleksijom u C #
  • Kako raditi s nadzornikom datoteka u C #
  • Kako izvesti lijenu inicijalizaciju u C #
  • Kako raditi s MSMQ-om u C #
  • Kako raditi s metodama produženja u C #
  • Kako do nas lambda izrazi u C #
  • Kada upotrijebiti hlapljivu ključnu riječ u C #
  • Kako koristiti ključnu riječ yield u C #
  • Kako implementirati polimorfizam u C #
  • Kako izraditi vlastiti planer zadataka u C #
  • Kako raditi s RabbitMQ u C #
  • Kako raditi s korpicom u C #
  • Istraživanje virtualnih i apstraktnih metoda u C #