Preporučeno, 2024

Izbor Urednika

Razlika između sučelja i apstraktne klase u Java & C #

Klasa sučelja i apstrakta doprinosi "nepotpunom tipu" u OOP-u. Ponekad nam je potrebna nadklasa da bismo definirali "što učiniti", ali ne i "kako to učiniti", to je način na koji će dio biti implementiran od strane izvedene klase u skladu s njegovom potrebom, " sučelje " pruža rješenje za to. Ponekad nam je potrebna klasa superklase koja definira neku generaliziranu strukturu koja se može implementirati izvedenim klasama i neku specificiranu strukturu koja se može koristiti od izvedenih klasa, " apstraktna klasa " pruža rješenje za to. Temeljna razlika između sučelja i apstraktne klase je da je sučelje potpuno nepotpuno, a apstraktna klasa djelomično nepotpuna.

Tablica usporedbe

Osnova za usporedbuSučeljeKlasa sažetka
Osnovni, temeljniKada imate samo znanje o zahtjevima, a ne o njegovoj implementaciji, koristite "Sučelje".Kada djelomično znate o implementacijama koristite "Abstract classes".
metodeSučelje sadrži samo apstraktne metode.Apstraktna nastava sadrži apstraktne metode kao i konkretne metode.
Pristup modifikatoru metodaMetode sučelja su uvijek "javne" i "sažetak", čak i ako ih ne deklariramo. Dakle, može se reći 100%, čista apstraktna klasa.Nije obavezno da će metoda u apstraktnoj klasi biti javna i apstraktna. Može imati i konkretne metode.
Ograničeni modifikator za metodeMetoda sučelja ne može se deklarirati sa sljedećim modifikatorima:
Javno: privatno i zaštićeno
Sažetak: završni, statični, sinkronizirani, native, strictfp.
Nema ograničenja modifikatora varijable apstraktne klase.
Pristup modifikatoru varijabliDopušteni modifikatori dopušteni za Interface varijable su javni, statični i konačni, bez obzira na to prijavljujemo li ili ne.Varijable u apstraktnoj klasi ne moraju biti javne, statične, konačne.
Ograničeni modifikatori za varijableVarijable sučelja ne mogu se deklarirati kao privatne, zaštićene, prolazne, nestabilne.Nema ograničenja na modifikatore apstraktnih varijabli klase.
Inicijalizacija varijabliVarijable sučelja moraju se inicijalizirati u vrijeme njihove deklaracije.Nije obavezno da se abstraktne varijable klase moraju inicijalizirati u vrijeme njezine deklaracije.
Primjer i statički blokoviUnutar sučelja ne možete proglasiti instancu ili statički blok.Apstraktna klasa dopušta instancu ili statički blok unutar njega.
graditeljiNe možete proglasiti unutar sučelja konstruktora.Konstruktor možete proglasiti unutar apstraktne klase.

Definicija sučelja

Java ne dopušta višestruko nasljeđivanje. To jest, jedna klasa ne može naslijediti više od jedne klase u isto vrijeme. Razlog tome može se objasniti primjerom. Pretpostavimo da imamo dvije roditeljske klase, A i B i izvedenu klasu C. Izvedena klasa C nasljeđuje i klase A i B. Sada, obje imaju klasu A i B imaju skup metoda (), onda će to biti pitanje za klasu C, koja klasa set () metoda treba naslijediti. Rješenje ovog problema je “sučelje”.

Sučelje je čista apstraktna klasa. Ključna riječ koja se koristi za stvaranje sučelja je "sučelje". Budući da su sve metode unutar sučelja potpuno apstraktne. Sučelje samo određuje što klasa mora raditi, ali ne definira kako to radi. Samo zato što su sve metode deklarirane unutar sučelja apstraktne, nije napravljena instanca za sučelje. Opći oblik "sučelja" u javi je:

 sučelje access_specifier interface_name {return-type method-name1 (popis parametara); return-type method-name2 (popis parametara); upišite final-varname1 = vrijednost; upišite final-varname2 = vrijednost; // ... povratna metoda-imeN (popis parametara); upišite final-varnameN = vrijednost; } 

Specifikator pristupa proglašava se javnim jer klase moraju implementirati sučelje.

Mi nemamo koncept "sučelja" u C ++. No, Java i C # definirati sučelje vrlo dobro.

Sučelje u Javi:

  • Varijable sučelja su po defaultu uvijek javne, statične i konačne.
  • Varijable se moraju inicijalizirati u vrijeme njezine deklaracije.
  • Varijable se nikada ne mogu proglasiti privatnim, zaštićenim, prolaznim i volatilnim.
  • Metode sučelja su uvijek javne i apstraktne, dok se one nikada ne mogu proglasiti privatnim, zaštićenim, konačnim, statičnim, sinkroniziranim, izvornim i strogim.
  • Ne možete proglasiti bilo koji konstruktor unutar sučelja jer je glavna svrha konstruktora inicijalizacija varijabli klase, ali u varijablama sučelja se inicijaliziraju u vrijeme njegove deklaracije.
  • Sučelje može naslijediti druga sučelja, ali klasa koja implementira takvo sučelje mora implementirati metode svih naslijeđenih sučelja.
  • Klasa može naslijediti više od jednog sučelja u isto vrijeme i mora implementirati sve metode svih naslijeđenih sučelja.

Opći oblik implementacije sučelja u Javi:

 class class_name implementira Interface_name {// class-body} 

Za nasljeđivanje sučelja, klasa koristi ključnu riječ "implementira", a klasa implementira sve metode koje je deklariralo naslijeđeno sučelje.

Sučelje u C #:

Sučelje u C # gotovo je slično sučelju u Javi osim:

  • Sučelje u C # ne deklarira varijable.
  • Naziv sučelja ima prefiks s velikim I i nasljeđuje se dvotočkom (:) znakom.

Opći oblik implementacije sučelja u C #:

 class class_name: interface_name {// class-body} 

Definicija apstraktne klase

Klasa koja sadrži jednu ili više apstraktnih metoda naziva se apstraktna klasa, a klasa je deklarirana kao sažetak pomoću ključne riječi "sažetak", kojoj prethodi "klasa" na početku deklaracije klase. Kako apstraktna klasa sadrži apstraktnu metodu, ona predstavlja nepotpuni tip. Stoga ne možete stvarati objekte apstraktne klase. Kad god klasa naslijedi apstraktnu klasu, ona mora implementirati sve apstraktne metode apstraktne klase ako to ne čini, onda mora biti i deklarirana kao apstraktna. Apstraktni atribut je naslijeđen dok se ne postigne potpuna implementacija apstraktnih metoda.

Apstraktna klasa može sadržavati i konkretne metode koje može koristiti izvedena klasa kao što je ona. No, ne možete deklarirati apstraktni konstruktor ili apstraktnu statičku metodu unutar apstraktne klase. Opći oblik apstraktne klase u Javi je sljedeći:

 apstraktna klasa class_name {apstraktna metoda_ime1 (); apstraktna metoda_ime2 (); : return_type method_name3 (parameter_list) {// konkretna metoda} return_type method_name4 (parameter_list) {// konkretna metoda}}; 

Koncept apstraktne klase je sličan u Java i C #. Apstraktna klasa se malo razlikuje u C ++.

U C ++, ako klasa ima barem jednu virtualnu funkciju, klasa postaje apstraktna klasa. Umjesto ključne riječi "sažetak", ključna riječ "virtualna" koristi se za deklariranje apstraktne metode.

Ključne razlike između sučelja i apstraktne klase u Java i C #

  1. Kada imate znanje o tome “što je potrebno”, ali ne i “kako bi se ono provodilo”, onda se mora koristiti sučelje. S druge strane, ako znate što je potrebno i djelomično znate kako će se provoditi, upotrijebite apstraktnu klasu.
  2. Sučelje ima sve svoje metode apstraktne, ali apstraktna klasa ima neke apstraktne metode i neke konkretne metode.
  3. Metode unutar sučelja su javne i apstraktne, stoga se naziva i čistom apstraktnom klasom. S druge strane, metode unutar apstrakta nisu ograničene samo na javni i sažetak.
  4. Metoda sučelja nikada ne može biti privatna, zaštićena, konačna, statična, sinkronizirana, izvorna ili stroga. S druge strane, nema ograničenja na metode apstraktne klase.
  5. Varijable u sučelju su javne i konačne, bez obzira da li ih deklariramo ili ne, ali ne postoji takvo ograničenje na varijable apstraktne klase koje su javne i konačne.
  6. Varijable u sučelju nikada ne mogu biti privatno zaštićene ili prolazne, dok ne postoji ograničenje na varijable u apstraktnoj klasi.
  7. Varijabla sučelja mora biti inicijalizirana tijekom deklaracije. S druge strane, varijable u apstraktnoj klasi mogu se inicijalizirati u bilo kojem trenutku.
  8. Unutar sučelja, instanca ili statički blok ne mogu biti deklarirani, ali možete deklarirati instancu ili statički blok unutar apstraktne klase.
  9. Ne možete definirati konstruktora unutar sučelja, dok možete definirati konstruktor unutar apstraktne klase.

Zaključak:

Kada trebate stvoriti baznu klasu koja sadrži generalizirani oblik metoda koje mogu biti izvedene izvedenim razredima prema njihovim potrebama, koncept sučelja i apstraktne klase pomaže u tome.

Top