Koks skirtumas tarp sąsajos ir abstrakčios klasės?

Koks skirtumas tarp sąsajos ir abstrakčios klasės?

1558 m
16 дек. nustatė Sarfrazas gruodžio 16 d 2009-12-16 11:15 '09 11:15 am 2009-12-16 11:15
@ 38 atsakymai
  • 1
  • 2

Sąsajos

Sąsaja yra sutartis : asmuo, rašantis sąsają, sako: „Ei, aš sutinku, kad tai atrodo taip“, o asmuo, naudodamas sąsają, sako: „Gerai, klasė, kurią parašau, atrodo taip.“

Sąsaja yra tuščias apvalkalas . Yra tik metodų parašai, iš kurių išplaukia, kad metodai neturi kūno. Sąsaja gali nieko nedaryti. Tai tik pavyzdys.

Pavyzdžiui (pseudokodas):

16 дек. Atsakymas pateikiamas e-satis 16 d. 2009-12-16 11:37 '09 11:37 2009-12-16 11:37

Pagrindiniai abstrakčios klasės ir sąsajos techniniai skirtumai:

  • Anotacijos klasėse gali būti konstantos, nariai, stubo metodai (metodai be kūno) ir tam tikri metodai, o sąsajos gali turėti tik konstantas ir metodus.

  • Abstrakčios klasės metodai ir nariai gali būti apibrėžti bet kokia išvaizda, o visi sąsajos metodai turi būti apibrėžti kaip public (pagal nutylėjimą jie apibrėžiami kaip vieši).

  • Kai abstrakta klasė yra paveldima, betono vaiko klasė turi apibrėžti abstrakčius metodus, o abstrakta klasė gali išplėsti kitą abstrakčią klasę, o abstrakčių metodų iš tėvų klasės negalima apibrėžti.

  • Be to, sąsaja, kuri išplėsta kitą sąsają, nėra atsakinga už metodų įgyvendinimą iš pagrindinės sąsajos. Taip yra dėl to, kad sąsajos negali apibrėžti jokio įgyvendinimo.

  • Vaikų klasė gali išplėsti tik vieną klasę (abstrakčią ar betoninę), o sąsaja gali išplėsti arba klasė gali įgyvendinti kelias kitas sąsajas.

  • Vaikų klasė gali apibrėžti abstrakčius metodus, turinčius tą patį ar mažiau ribojantį matomumą, o klasė, įgyvendinanti sąsają, turi apibrėžti tokį pat matomumą (viešą).

795
16 дек. Atsakymą pateikė Justin Johnson 16 d. 2009-12-16 13:11 '09, 13:11 2009-12-16 13:11

Sąsajoje yra tik funkcijų apibrėžimas / parašas, ir jei turime bendrų funkcijų, taip pat bendrų parašų, turime naudoti abstrakčią klasę. Naudodami abstrakčią klasę, vienu metu galime suteikti tiek elgesį, tiek funkcionalumą. Kitas kūrėjas, paveldėjęs abstrakčią klasę, gali lengvai naudoti šią funkciją, nes jie turės užpildyti blankus.

2019

15 сент. Atsakymas pateikiamas Vivek 15 rugsėjo. 2013-09-15 11:59 '13, 11:59 2013-09-15 11:59

Kai kurie svarbūs skirtumai:

Lentelės forma:

2019

37
16 мая '13 в 8:55 2013-05-16 08:55 atsakymas pateikiamas „ softmage99“ gegužės 16 d., 13 val. 8:55 2013-05-16 08:55

Nenorėčiau pabrėžti skirtumų, kurie jau minėti daugelyje atsakymų (dėl viešųjų statinių galutinių modifikatorių sąsajoje ir parama saugomiems privatiems metodams abstrakčiose klasėse)

Paprasčiau tariant, norėčiau pasakyti:

sąsaja: įgyvendinti sutartį su keliais nesusijusiais objektais

abstrakta klasė: įgyvendinti tą patį arba skirtingą elgesį tarp kelių susijusių objektų

Iš „Oracle“ dokumentacijos

Apsvarstykite galimybę naudoti abstrakčias klases, jei:

  • Norite bendrinti kodą tarp kelių artimųjų klasių.
  • Tikitės, kad klasėms, kurios išplės jūsų abstrakčią klasę, yra daug bendrų metodų ar laukų, arba reikalauti kitų prieigos modifikatorių, išskyrus viešuosius (pvz., Apsaugotus ir uždarytus).
  • Norite deklaruoti nestatinius arba ne galutinius laukus.

Apsvarstykite galimybę naudoti sąsajas, jei:

  • Tikimasi, kad nesusijusios klasės įgyvendins savo sąsają. Pavyzdžiui, daugelis nesusijusių objektų gali įdiegti Serializable sąsają.
  • Norite nurodyti konkretaus tipo duomenų elgesį, tačiau nesusiję su tuo, kas vykdo savo elgesį.
  • Jūs norite naudoti keleto tipų paveldėjimą.

abstrakčių klasių rinkiniai „yra“ klasėje. Sąsaja suteikia „galimybę“ klasėms.

Jei ieškote „ Java kaip programavimo kalbos, pridėkite dar keletą naujinimų:

„Java 8“ šiek tiek sumažino atotrūkį tarp interface ir abstract klasių, suteikdama default metodo funkciją. Sąsaja neturi šio metodo įgyvendinimo, dabar ji negalioja.

Daugiau informacijos rasite šiame dokumentacijos puslapyje .

Pažvelkite į šį klausimą SE kodų pavyzdžiams, kad geriau suprastumėte.

Kaip turėčiau paaiškinti skirtumą tarp sąsajos ir abstrakčios klasės?

35
27 нояб. atsakymas pateiktas Ravindra babu 27 lapkričio. 2015-11-27 15:42 '15 15:42 2015-11-27 15:42

Svarbiausia, kad:

  • Santrauka sutelkta į objektus . Jame pateikiami pagrindiniai duomenys, kuriuos turi atlikti objektas ir (arba) funkcijos. Jis yra susijęs su pagrindinėmis objekto savybėmis: ką jis turi ir ką jis gali padaryti. Todėl pagrindiniai bruožai (apibendrinimas) yra paveldėti iš tos pačios abstrakčios klasės objektai.
  • Sąsaja yra orientuota į funkcionalumą . Jis apibrėžia objekto funkcionalumą. Nesvarbu, kokio objekto ji turi, kol ji gali atlikti šias funkcijas, kurios yra apibrėžtos sąsajoje, tai gerai. Jis ignoruoja likusią dalį. Objekte / klasėje gali būti kelios (grupės) funkcionalumo; todėl klasė gali įgyvendinti kelias sąsajas.
26
29 сент. atsakymas suteiktas 29 rugsėjo mėn. 2014-09-29 12:54 '14 at 12:54 2014-09-29 12:54

Pastatau 300 aukštų pastatą

Sąsajos statybos planas

  • Pavyzdžiui, „Servlet“ (I)

Pastatas buvo pastatytas iki 200 aukštų - iš dalies baigtas --- santrauka

  • Dalinis įgyvendinimas, pavyzdžiui, bendras ir HTTP servletas

Baigtų statyti statiniai - betonas

  • Visiškas įgyvendinimas, pavyzdžiui, jūsų servletas

Sąsaja

  • Mes nieko nežinome apie įgyvendinimą, tik reikalavimus. Galime pereiti prie sąsajos.
  • Kiekvienas metodas yra viešas ir abstraktus.
  • Tai 100% grynai abstrakta klasė.
  • Jei skelbiame visuomenę, negalime paskelbti privačių ir saugomų
  • Jei paskelbsime abstrakčius, negalėsime paskelbti galutinio, statinio, sinchronizuoto, griežto ir vietinio
  • Kiekviena sąsaja turi atvirą, statinį ir galutinį
  • Serializacija ir trumpalaikis veiksmas netaikomas, nes negalime sukurti sąsajos egzemplioriaus.
  • Nepastovus, nes jis yra galutinis
  • Kiekvienas kintamasis yra statinis
  • Kai deklaruojame kintamąjį sąsajos viduje, deklaruodami turime inicijuoti kintamuosius
  • Pavyzdys ir statinis blokas neleidžiami

Anotacija

  • Dalinis įgyvendinimas
  • Jis turi abstraktų metodą. Be to, jis naudoja betoną
  • Be apribojimų abstrakčios klasės metodo modifikatoriams
  • Abstrakčių klasės kintamųjų modifikatorių apribojimų nėra
  • Negalime deklaruoti kitų nei modifikatorių.
  • Kintamųjų inicijavimo apribojimų nėra

Paimta iš svetainės DurgaJobs

23
09 июля '14 в 21:00 2014-07-09 21:00 Atsakymą pateikė Jaichander, liepos 9 d. 14 d. 21:00 val. 2014-07-09 21:00

Jei norite suteikti polimorfinį elgesį paveldėjimo hierarchijoje, naudokite abstrakčias klases.

Jei norite polimorfinį elgesį klasėms, kurios yra visiškai nesusijusios, naudokite sąsają.

23
28 мая '12 в 7:42 2012-05-28 07:42 atsakymą pateikė skulptorius gegužės 28 d. 12 val. 07:42 2012-05-28 07:42

Grįžkime prie šio klausimo dar kartą:

Pirmas dalykas, kurį žinote, yra tas, kad 1/1 ir 1 * 1 rezultatai yra tokie patys, tačiau tai nereiškia, kad dauginimas ir padalijimas yra vienodi. Akivaizdu, kad jie turi gerus santykius, tačiau abu esate skirtingi.

Pabrėžsiu pagrindinius skirtumus, o likusi dalis jau paaiškinta:

Anotacijos klasės yra naudingos klasių hierarchijoms modeliuoti. Iš pirmo žvilgsnio bet koks reikalavimas, mes iš dalies žinome, kas turi būti tiksliai , bet mes žinome, ką kurti. Taigi jūsų abstrakčios klasės yra jūsų pagrindinės klasės.

Sąsajos yra naudingos leidžiant kitoms hierarchijoms ar klasėms žinoti, ką galiu padaryti. Ir kai jūs sakote, kad aš galiu kažką, turite turėti tą gebėjimą. Sąsajos tai pažymės kaip privalomą klasei, kad galėtų įgyvendinti tas pačias funkcijas.

18
11 апр. Atsakymas, kurį pateikė Dhananjay Apr 11 2012-04-11 08:18 '12 at 8:18 2012-04-11 08:18

Abstrakta klasė be jokio įgyvendinimo tiesiog atrodo kaip sąsaja; tačiau yra daug skirtumų nei abstrakčios klasės ir sąsajos panašumas. Leiskite paaiškinti abi sąvokas ir palyginti jų panašumus ir skirtumus.

Kas yra abstrakta klasė?

Abstrakta klasė yra speciali klasė, kurios negalima sukurti. Taigi kyla klausimas, kodėl mums reikia klasės, kuri negali būti sukurta? Abstrakta klasė turėtų būti tik klasifikuojama (paveldėta iš). Kitaip tariant, tai leidžia kitoms klasėms paveldėti iš jo, bet negali būti sukurta. Privalumas yra tas, kad jis suteikia tam tikrų hierarchijų visoms poklasiams. Paprastai tai yra sutartis, kuri verčia visus poklasius laikytis tos pačios hierarchijos ar standarto.

Kas yra sąsaja?

Sąsaja nėra klasė. Tai objektas, kurį apibrėžia žodis Interface. Sąsaja neturi įgyvendinimo; ji turi tik parašą arba, kitaip tariant, tik metodų apibrėžimą be kūno. Kaip vienas iš panašumų su abstrakčia klase, tai yra sutartis, kuri naudojama apibrėžti visų poklasių hierarchiją arba apibrėžia konkretų metodų rinkinį ir jų argumentus. Pagrindinis skirtumas tarp šių dviejų yra tas, kad klasė gali įgyvendinti daugiau nei vieną sąsają, tačiau tik viena abstrakta klasė gali paveldėti. Kadangi C # nepalaiko keleto paveldėjimo, sąsajos naudojamos daugkartiniam paveldėjimui įgyvendinti.

Abu kartu

Kurdami sąsają, mes iš esmės sukuriame metodų rinkinį be jokio įgyvendinimo, kurį reikia iš naujo apibrėžti įgyvendinamose klasėse. Privalumas yra tai, kad klasė gali būti dviejų klasių dalis: viena iš paveldėjimo hierarchijos ir viena iš sąsajų.

Kurdami abstrakčią klasę, sukuriame bazinę klasę, kuri gali turėti vieną ar daugiau užbaigtų metodų, tačiau bent vienas ar keli metodai lieka neišsamūs ir paskelbti abstrakčiais. Jei visi abstrakčios klasės metodai nėra baigti, tai panaši į sąsają. Abstrakčios klasės tikslas - pateikti bazinės klasės apibrėžimą, kaip išvestų klasių rinkinys veiks, ir tada leis programuotojams užpildyti įgyvendinimą išvestose klasėse.


Yra keletas panašumų ir skirtumų tarp sąsajos ir abstrakčios klasės. 2019

15 нояб. atsakymą pateikė Thilina Sandunsiri 15 nov. 2015-11-15 06:51 '15, 6:51 am 2015-11-15 06:51

Tai gana paprasta.

Galite galvoti apie sąsają kaip klasę, kuriai leidžiama turėti tik abstrakčius metodus ir nieko daugiau.

Taigi sąsaja gali „tik deklaruoti“ ir neapibrėžti elgesio, kurį norite, kad klasė turėtų.

Abstrakta klasė leidžia jums deklaruoti (naudojant abstrakčius metodus) ir apibrėžti (naudojant visišką metodo įgyvendinimą) elgesį, kurį norite, kad klasė turėtų.

Ir įprastinė klasė leidžia jums apibrėžti, o ne deklaruoti, elgesį / veiksmus, kuriuos norite turėti klasėje.

Paskutinis

„Java“ galite įdiegti kelias sąsajas, tačiau galite išplėsti tik vieną (abstrakčią klasę ar klasę) ...

Tai reiškia, kad tam tikro elgesio paveldėjimas apsiriboja tik tomis, kurios leidžiama kiekvienai klasei, t.y. jei norite, kad klasė, apgaubta A, B ir C klasių elgesiu, turėtų būti atlikta taip: A klasė praplečia B, C klasė praplečia A .. jos šiek tiek apvalaus kelio paveldėjimo būdu ...

Kita vertus, sąsajos, galite tiesiog: sąsaja C įgyvendina A, B

Taigi „Java“ palaiko daugkartinį paveldėjimą tik „deklaruotame elgesyje“, t.y. sąsajos ir tik vienas paveldėjimas su tam tikru elgesiu.

Tikiuosi, kad tai prasminga.

12
23 июля '14 в 2:36 2014-07-23 02:36 atsakymas pateikiamas g00dnatur3 liepos 23 d., 14 d., 2:36, 2014-07-23 02:36

Palyginus sąsają su abstrakčia klase, neteisinga. Vietoj to turėtų būti dar du palyginimai: 1) sąsaja prieš klasę ir 2) abstrakta ir galutinė klasė .

Sąsaja prieš klasę

Sąsaja yra sutartis tarp dviejų objektų. Pavyzdžiui, esu paštininkas, o jūs esate pristatymo paketas. Tikiuosi, kad sužinosite savo pristatymo adresą. Kai kas nors duos man paketą, jis turėtų žinoti savo pristatymo adresą:

 interface Package { String address(); } 

Klasė yra objektų grupė, kuriai taikoma sutartis. Pvz., Esu dėžutė iš „Box“ grupės, ir aš kreipiuosi į Pašto siuntėjo reikalaujamą sutartį. Kartu pateikiu kitas sutartis:

 class Box implements Package, Property { @Override String address() { return "5th Street, New York, NY"; } @Override Human owner() { // this method is part of another contract } } 

Santrauka prieš finalą

Abstrakta klasė yra nebaigtų objektų grupė. Jie negali būti naudojami, nes jie praleidžia kai kurias dalis. Pvz., Aš esu abstraktus >

 abstract class GpsBox implements Package { @Override public abstract String address(); protected Coordinates whereAmI() { // connect to GPS and return my current position } } 

Ši klasė, jei paveldima / išplėsta kita klasė, gali būti labai naudinga. Bet savaime - tai nenaudinga, nes ji neturi daiktų. Anotacijos klasės gali būti elementai iš galutinių klasių.

Galutinė klasė yra pilnų objektų grupė, kuri gali būti naudojama, bet negali būti pakeista. Jie tiksliai žino, kaip dirbti ir ką daryti. Pavyzdžiui, aš esu >

 final class DirectBox implements Package { private final String to; public DirectBox(String addr) { this.to = addr; } @Override public String address() { return this.to; } } 

В большинстве языков, таких как Java или С++, возможно иметь только класс , ни абстрактный, ни окончательный. Такой класс может быть унаследован и может быть инстанцирован. Я не думаю, что это строго соответствует объектно-ориентированной парадигме.