Skirtumas tarp abstrakcijos ir kapsuliavimo?

Kokie yra tikslūs skirtumai tarp kapsulių ir abstrakcijų?

297
12 апр. Rocky rinkinys balandžio 12 d 2009-04-12 23:15 '09 23:15 PM 2009-04-12 23:15
@ 42 atsakymai
  • 1
  • 2

Dauguma čia pateiktų atsakymų yra sutelkti į OOP, bet kapsuliavimas prasideda daug anksčiau:

  • Kiekviena funkcija yra kapsulė ; pseudokode:

     point x = { 1, 4 } point y = { 23, 42 } numeric d = distance(x, y) 

    Čia distance apima (Euklido) atstumo tarp dviejų taškų plokštumoje skaičiavimą: jis slepia įgyvendinimo detales. Ši kapsulė yra švari ir paprasta.

  • Abstrakcija yra apibendrinimo procesas : konkretus įgyvendinimas ir taikymas skirtingiems, nors ir šiek tiek susijusiems, duomenų tipams. Klasikinis abstrakcijos pavyzdys yra Cs qsort funkcija, skirta duomenims rūšiuoti:

    qsort “ taškas yra tas, kad ji nerūpi duomenų rūšiavimu - iš tikrųjų ji nežino, kokie duomenys yra. Atvirkščiai, jo įvesties tipas yra nepagrįstas rodiklis ( void* ), kuris yra tiesiog Cs metodas: „Man nereikia duomenų tipo“ (tai taip pat vadinama tipo ištrynimu). Svarbus dalykas yra tai, kad qsort diegimas visada lieka tas pats, neatsižvelgiant į duomenų tipą. Vienintelis dalykas, kurį reikia keisti, yra palyginimo funkcija, kuri nuo duomenų tipo skiriasi nuo duomenų tipo. todėl qsort tikisi, kad vartotojas nurodytą palyginimo funkciją pateikia kaip funkcijų argumentą.

Kapsuliavimas ir abstrakcija vyksta kartu su ta prasme, kad jūs galite pasakyti, kad jie yra tikrai neatskiriami. Praktiniais tikslais tai tikriausiai tiesa; sakoma, tai yra kapsulė, kuri nėra svarbi abstrakcijos dalis:

 class point { numeric x numeric y } 

Mes supakuojame taškų koordinates, bet nesumažiname jų abstrakčiai, nesugrupuodami jų logiškai.

Ir čia yra abstrakcijos pavyzdys, kuris nėra kapsuliavimas:

 T pi<T> = 3.1415926535 

Tai yra bendras kintamasis, turintis tam tikrą reikšmę (π), o deklaracijoje nėra tikslaus kintamojo tipo. Tiesa, „Id“ būtų sunku rasti kažką panašaus į realų kodą: abstrakcija beveik visada naudoja kapsulę. Tačiau minėtas dalykas egzistuoja C + + (14), naudojant kintamuosius šablonus (= bendrus šablonus kintamiesiems); šiek tiek sudėtingesnė sintaksė, pavyzdžiui:

233
13 апр. Konrad Rudolph atsakymas, pateiktas balandžio 13 d 2009-04-13 15:02 '09 ne 15:02 2009-04-13 15:02

Kapsuliavimas slepia įgyvendinimo detales, kurios gali arba negali būti taikomos bendram ar specializuotam elgesiui.

Abstrakcija suteikia apibendrinimą (pvz., Per elgesio rinkinį).

Štai geras skaitymas: „ Abstrakcija“, „Kapsuliavimas“ ir „Informacijos slėpimas“ „ Edward V. Berar“ iš Objektų agentūros.

119
12 апр. atsakymas duotas tiesioginiu balandžio 12 d 2009-04-12 23:20 '09, 23:20, 2009-04-12 23:20

įdėklas įdeda kai kuriuos daiktus į dėžutę ir suteikia jums akį; jis neleidžia jums dirbti su įrankiais.

abstrakta abstrakcija ignoruoja detales, kurios neturi reikšmės, pavyzdžiui, ar daiktai turi įrankius, reketus, smagračius ar branduolius; jie tiesiog „eina“

kapsulių pavyzdžiai:

  • Trumpa apranga
  • Įrankių juosta
  • piniginėje
  • maišelį
  • kapsulę
  • šaldytas karbonitas
  • laukas su mygtuku arba be jo
  • burrito (techniškai tortilla aplink burrito)

abstrakcijos pavyzdžiai:

  • „dalykų grupės“ yra abstrakcija (kurią vadiname agregacija)
  • „dalykai, kuriuose yra kitų dalykų“ yra abstrakcija (kurią vadiname kompozicija)
  • „konteineris“ - tai kita abstrakcijos rūšis „dalykai, kuriuose yra kitų dalykų“; Atkreipkite dėmesį, kad visi kapsulių pavyzdžiai yra konteinerių tipai, bet ne visi konteineriai rodo / užtikrina kapsulę. Pvz., Krepšelis yra konteineris, kurio turinys nėra kapsulėje.
94
13 апр. Steven A. Lowe atsakymas balandžio 13 d 2009-04-13 01:10 '09 ne 1:10 2009-04-13 01:10

Daug atsakymų ir jų pavyzdžių yra klaidinantys.

Kapsuliavimas - tai duomenų ir funkcijų, veikiančių su šiais duomenimis, pakavimas į vieną komponentą ir apribojimas prieiga prie tam tikrų objekto komponentų.
Kapsuliavimas reiškia, kad vidinis objekto atvaizdavimas paprastai yra paslėptas už objekto apibrėžties.

Abstrakcija yra mechanizmas, kuris atspindi pagrindines funkcijas, neįskaitant įgyvendinimo detalių.

Kapsuliavimas: - informacijos slėpimas .
Abstrakcija: - slėpimo įgyvendinimas .

Pavyzdys:

 class foo{ private: int a, b; public: foo(int x=0, int y=0): a(x), b(y) {} int add(){ return a+b; } } 

Bet kokio klasės foo objekto vidinis atvaizdas foo paslėptas už klasės ribų. → Kapsuliavimas.
Bet koks galimas foo objekto elementas (duomenys / funkcija) yra ribotas ir prieinamas tik šiam objektui.

 foo foo_obj(3, 4); int sum = foo_obj.add(); 

add metodo įgyvendinimas yra paslėptas. → Abstrakcija.

88
24 марта '15 в 7:04 2015-03-24 07:04 Atsakymą pateikia „ Haccks “ kovo 24 d. 15 val. 07:04 2015-03-24 07:04

Kapsuliavimas slepia duomenis, pvz., Naudodamas „getters“ ir „seters“ ir kt.

„Abstrakcija“ reiškia įgyvendinimo paslėpimą naudojant abstrakčią klasę ir sąsajas ir tt

64
27 нояб. Atsakymas pateikiamas NoNaMe lapkričio 27 d. 2012-11-27 20:29 „12 at 8:29 pm 2012-11-27 20:29

Abstrakcija - apibendrintas narys. tai yra, kapsuliavimas yra abstrakcijos pogrupis.

2019

37
06 июля '15 в 13:41 2015-07-06 13:41 atsakymas pateikiamas Premraj liepos 06 d. 15, 13:41 2015-07-06 13:41
  • Abstrakcija leidžia jums sutelkti dėmesį į tai, ką objektas daro, o ne kaip tai daro.
  • Kapsuliavimas reiškia vidinės detalės ar mechanikos paslėpimą, kaip objektas daro kažką.

Kaip ir automobilyje, žinote, ką veikia dujų pedalas, bet jūs negalite žinoti proceso už jo, nes jis yra kapsuliuojamas.

Leiskite pateikti pavyzdį C #. Tarkime, kad turite sveiką skaičių:

 int Number = 5; string aStrNumber = Number.ToString(); 

Galite naudoti „Number.ToString“ () tipą, kuris grąžina simbolių vaizdą iš 5 ir saugo jį eilutės objektuose. Metodas pasakoja, ką jis daro, o ne kaip tai daro.

29
12 апр. Jasonco atsakymas, pateiktas balandžio 12 d 2009-04-12 23:22 '09, 23:22 pm 2009-04-12 23:22

Pirmiau yra daug gerų atsakymų, bet aš pristatysiu savo požiūrį čia („Java“).

Duomenų įdėjimas paprasčiausiai reiškia logiškai sugrupuotų duomenų perdavimą ir prieigą prie jos. Tai paprastai siejama su kitu raktiniu žodžiu - „ Slėpti duomenis“ . Tai pasiekiama „Java“ naudojant prieigos modifikatorius .

Paprastas pavyzdys būtų apibrėžti privatų kintamąjį ir suteikti prieigą prie jo naudojant getter ir setter metodus arba sukurti asmeninį metodą, nes jis naudoja tik klasę. Vartotojas neturi žinoti apie šiuos metodus ir kintamuosius.

Pastaba Nereikėtų suprasti, kad kapsuliavimas susijęs tik su slepiamais duomenimis. Kalbėdami apie kapsuliavimą, pagrindinis dėmesys turėtų būti skiriamas grupavimui ar pakavimui, arba susijusių duomenų ir elgesio derinimui.

Kita vertus, duomenų abstrakcija yra apibendrinimo sąvoka, taigi pagal sudėtingą logiką jis nepateikiamas vartotojui. „Java“ tai pasiekiama naudojant sąsajas ir abstrakčias klases.

Pavyzdys yra

Tarkime, mes turime gyvūnų sąsają , ir ji turi funkciją, vadinamą makeSound () . Yra dvi konkrečios klasės: šuo ir katė , kurios įgyvendina šią sąsają. Šios specifinės klasės turi atskirą makeSound () funkcijos įgyvendinimą. Tarkime, kad mes turime gyvūną (mes jį gauname iš kai kurių išorinių modulių). Visi vartotojai žino, kad objektas, kurį jis gauna, yra gyvūnas, o atsakomybė už gyvūnų spausdinimą yra naudotojų atsakomybė. Vienas iš būdų brutaliajai jėgai yra patikrinti gautą objektą, kad būtų galima nustatyti jo tipą, tada įrašyti ant šio gyvūno tipo ir tada skambinti makeSound (). Tačiau tikslesnis būdas yra abstraktus dalykas . Naudokite „Animal“ kaip polimorfinę nuorodą ir skambinkite „makeSound“ (). Runtime , priklausomai nuo to, kokio tipo realus objektas yra naudojamas, jis bus vadinamas.

Skaitykite daugiau čia .

2019

24
04 янв. Aniket Thakur atsakymas sausio 04 2014-01-04 22:13 '14, 10:13 pm 2014-01-04 22:13

Tai yra šiek tiek miglotos sąvokos, kurios nėra unikalios kompiuterių mokslams ir programavimui. Norėčiau pasiūlyti papildomų minčių, kurios galėtų padėti kitiems suprasti šias svarbias sąvokas.


Trumpas atsakymas

Kapsuliavimas . Paslėpti ir (arba) apriboti prieigą prie tam tikrų sistemos dalių, kai atskleidžiama reikalinga sąsaja.

Abstrakcija Keičiantis kažką su tam tikromis ypatybėmis, išskyrus konkrečias realybes, konkrečius objektus ar realius atvejus, sumažėja sudėtingumas.

Pagrindinis panašumas yra tas, kad šie metodai skirti gerinti supratimą ir naudingumą.

Pagrindinis skirtumas yra tas, kad abstrakcija yra priemonė paprasčiausiai reprezentuoti daiktus (dažniausiai, kad atstovavimas būtų plačiau taikomas), o kapsuliavimas - tai būdas, kaip keisti kitų dalykų sąveiką su kažkuo.


Ilgas atsakymas

Kapsuliavimas

Čia yra kapsuliavimo pavyzdys, kurį, tikiuosi, padarys aiškesnius dalykus:

2019

23
26 дек. Atsakymą pateikė NanoWizard, gruodžio 26 d. 2015-12-26 08:16 '15 at 8:16 2015-12-26 08:16

Kapsuliavimas : slepia nepageidaujamą / nenumatytą / patikimą informaciją apie realių objekto naudotojų įgyvendinimą. Pavyzdžiui.

 class Aeroplane : IFlyable, IFuelable, IMachine { // Aeroplane Design says: // Aeroplane is a flying object // Aeroplane can be fueled // Aeroplane is a Machine } // But the code related to Pilot, or Driver of Aeroplane is not bothered // about Machine or Fuel. Hence, // pilot code: IFlyable flyingObj = new Aeroplane(); flyingObj.Fly(); // fighter Pilot related code IFlyable flyingObj2 = new FighterAeroplane(); flyingObj2.Fly(); // UFO related code IFlyable ufoObj = new UFO(); ufoObj.Fly(); // **All the 3 Above codes are genaralized using IFlyable, // Interface Abstraction** // Fly related code knows how to fly, irrespective of the type of // flying object they are. // Similarly, Fuel related code: // Fueling an Aeroplane IFuelable fuelableObj = new Aeroplane(); fuelableObj.FillFuel(); // Fueling a Car IFuelable fuelableObj2 = new Car(); // class Car : IFuelable { } fuelableObj2.FillFuel(); // ** Fueling code does not need know what kind of vehicle it is, so far // as it can Fill Fuel** 
21
13 апр. Atsakymą pateikė NileshChauhan balandžio 13 d 2009-04-13 14:16 '09, 14:16, 2009-04-13 14:16

Skirtumas tarp abstrakcijos ir kapsuliavimo.

2019

13
30 авг. Zayn Ali atsakymas rugpjūčio 30 d 2014-08-30 03:07 '14 at 3:07 2014-08-30 03:07

Abstrakcija: idėja yra pateikti kažką supaprastintu / kitokiu būdu, kuris yra lengviau suprantamas ir naudojamas ar labiau tinkamas situacijai.

Apsvarstykite klasę, kuri siunčia el. Laišką ... ji naudoja abstrakciją, kad parodytų save kaip pasiuntinio berniuką, todėl galite skambinti elektroniniu paštu: emailSender.send (paštas, gavėjas). Tai, ką jis iš tikrųjų daro, yra POP3 / SMTP, skambučių serverių, MIME vertimo ir kt. Pasirinkimas. Jūs matote tik savo berniuko pasiuntinį.

Kapsuliavimas: idėja apsaugoti ir paslėpti duomenis ir metodus, kurie yra privatūs objektui. Jis labiau susijęs su kažko nepriklausomo ir patikimo kūrimu.

Paimkite mane, pavyzdžiui. Savo širdies susitraukimų dažnį siejau iš likusio pasaulio. Kadangi nenoriu, kad kas nors keistų šį kintamąjį, ir man nereikia, kad kas nors jį nustatytų taip, kad galėčiau veikti. Tai man labai svarbu, bet jums nereikia žinoti, kas tai yra, ir jūs tikriausiai nesirūpinate.

Pažvelkite aplink, pamatysite, kad beveik viskas, ką paliečiate, yra abstrakcijos ir kapsuliavimo pavyzdys. Pavyzdžiui, jūsų telefonas pateikia jums abstrakciją apie tai, ką galite pasakyti ir ką nors pasakyti kitam - dėl GSM, procesoriaus architektūros, radijo dažnių ir milijono kitų dalykų, kurių nesuprantate ir nerūpi. Ji taip pat apima tam tikrus duomenis iš jūsų, pvz., Serijos numerius, identifikavimo numerius, dažnius ir kt.

Visa tai daro pasaulį malonesne vieta gyventi: D

11
18 дек. Atsakymą pateikė Sudhir Jonathan 18 d. 2009-12-18 13:58 '09 13:58 2009-12-18 13:58

Abstrakcija: rodoma tik reikiama informacija. Sutelkime dėmesį į kompiuterio įjungimo pavyzdį. Naudotojas neturi žinoti, kas vyksta, kol sistema vis dar įkeliama (ši informacija yra paslėpta naudotojui).

Paimkite kitą pavyzdį: ATM. Klientui nereikia žinoti, kaip mašina skaito PIN kodą ir apdoroja sandorį. Viskas, ką reikia padaryti, yra įvesti PIN kodą, paimti pinigus ir palikti.

Kapsuliavimas: paslepia jautrios klasės duomenis, iš dalies privatizuodama jos dalį. Tai yra būdas išlaikyti tam tikrą konfidencialią informaciją savo klientams, neleidžiant prieigai prie jos iš išorės.

10
11 февр. Atsakymą davė Dav'T , vasario 11 d. 2011-02-11 14:12 '11 at 14:12 pm 2011-02-11 14:12

Kitas pavyzdys:

Tarkime, kad sukūriau nekintamą klasės stačiakampį taip:

 class Rectangle { public: Rectangle(int width, int height) : width_(width), height_(height) {} int width() const { return width_; } int height() const { return height_; } private: int width_; int height_; } 

Dabar akivaizdu, kad aš turiu kapsulinį plotį ir aukštį (prieiga yra kažkaip apribota), bet aš nesu abstrakčios viskas (gerai, gal aš ignoravau, kur stačiakampis yra koordinačių erdvėje, tačiau tai yra pavyzdys).

Gera abstrakcija paprastai reiškia gerą kapsuliavimą.

Geros abstrakcijos pavyzdys yra bendra duomenų bazių jungčių klasė. Jos viešoji sąsaja yra nepriklausoma nuo duomenų bazės ir labai paprasta, tačiau tai leidžia man tai daryti norint. Ir pamatyti? Taip pat yra kapsuliavimas, nes klasėje turi būti visi žemo lygio aprašai ir skambučiai.

8
13 апр. Paweł Hajdan atsakymas, pateiktas balandžio 13 d '09 в 13:27 2009-04-13 13:27

Abstraction и Encapsulation , используя один обобщенный пример

-------------------------------------------- -------------------------------------------------- --------------------------------------

Мы все используем калькулятор для вычисления сложных проблем!

2019

8
ответ дан Devrath 26 авг. '13 в 13:50 2013-08-26 13:50

Механизм, который защищает данные от конкретных объектов от преднамеренного или случайного неправильного использования внешними функциями, называется " Encapsulation данных

Акт представления основных функций без включения фоновых деталей или объяснений известен как абстракция

7
ответ дан C. Punitha 17 окт. '11 в 18:39 2011-10-17 18:39

Абстракция: Абстракция означает отображение части функциональности What .

Инкапсуляция: Инкапсуляция означает скрытие части функции How .