Vairāk
Kāda ir atšķirība starp saskarni un abstrakto klasi?
Kāda ir atšķirība starp saskarni un abstrakto klasi?
1699
3
Kāda ir atšķirība starp saskarni un abstrakto klasi?
Saskarnes
Saskarne ir līgums: Persona, kas raksta interfeisu, saka: "hei, es pieņemu, ka lietas izskatās šādi", un persona, kas izmanto interfeisu, saka: "OK, klase, ko es rakstu, izskatās šādi".
Interfeiss ir tukšs apvalks. Tajā ir tikai metožu paraksti, kas nozīmē, ka metodēm nav ķermeņa. Interfeiss neko nevar'darīt. Tas ir tikai modelis.
Piemēram (pseidokods):
Interfeisa ieviešana patērē ļoti maz procesora jaudas, jo tā nav klase, tikai vārdu kopums, un tāpēc nav jāveic dārga meklēšana. Tas ir lieliski, kad tas ir svarīgi, piemēram, iegultajās ierīcēs.
Abstraktās klases
Abstraktās klases atšķirībā no saskarnēm ir klases. To lietošana ir dārgāka, jo, pārņemot no tām, ir jāveic meklēšana.
Abstraktās klases izskatās ļoti līdzīgi saskarnēm, taču tām ir kas vairāk: Tām var definēt uzvedību. Tas vairāk nozīmē, ka cilvēks saka: "Šīm klasēm vajadzētu izskatīties šādi, un tām ir tas, kas tām kopīgs, tāpēc aizpildiet tukšos laukumus!".
Piemēram:
Īstenošana
Lai gan abstraktajām klasēm un saskarnēm vajadzētu būt atšķirīgiem jēdzieniem, implementācijas padara šo apgalvojumu dažkārt nepatiesu. Dažreiz tās pat nav tādas, kādas jūs domājat, ka tās ir.
Programmā Java šis noteikums tiek stingri ievērots, savukārt PHP interfeisi ir abstraktas klases bez deklarētām metodēm.
Python valodā abstraktās klases drīzāk ir programmēšanas triks, ko var iegūt no ABC moduļa, un patiesībā tiek izmantotas metaklases, tātad klases. Savukārt interfeisi šajā valodā ir vairāk saistīti ar pīļu tipizēšanu, un tas'ir konvenciju un īpašu metožu, kas izsauc deskriptorus (__metodes_ metodes), sajaukums.
Kā parasti programmēšanā ir teorija, prakse un prakse citā valodā :-)
Paskaidrojumu var atrast šeit:
Katrā ziņā man šis interfeisu skaidrojums šķiet nedaudz mulsinošs. Biežāk lietotā definīcija ir šāda: Interfeiss definē līgumu, kas jāpilda implementējošajām klasēm. Interfeisa definīcija sastāv no publisko locekļu parakstiem, bez ieviešanas koda..
Tā īsti nav atbilde uz sākotnējo jautājumu, bet, kad būsiet uzzinājuši, kāda ir atšķirība starp tām, jūs varēsiet atrisināt dilemmu, kad izmantot katru no tiem: https://stackoverflow.com/questions/1231985/when-to-use-interfaces-or-abstract-classes-when-to-use-both
Man'ir ierobežotas zināšanas par OOP, bet saskarņu kā īpašības vārda ekvivalenta aplūkošana gramatikā man līdz šim ir darbojusies (labojiet mani, ja šī metode ir fiktīva!). Piemēram, saskarņu nosaukumi ir kā atribūti vai iespējas, ko var piešķirt klasei, un klasei var būt daudz šādu atribūtu: ISerializable, ICountable, IList, ICacheable, IHappy, ...