O clasă abstractă - o clasă care nu implementează una sau mai multe metode (unele limbi necesită astfel de metode pentru a marca cuvinte cheie speciale).
Interface - este o clasă abstractă care nu are nicio metodă nu este implementată, tot publicul și nu există nici o clasă de variabile.
Interfața este de obicei necesară numai atunci când interfața descrisă (tautologie). De exemplu, o clasă vrea să dea o altă oportunitate de a avea acces la unele dintre metodele lor, dar nu vrea să se „să dezvăluie.“ Deci, el pur și simplu pune în aplicare interfață.
O clasă abstractă este necesară atunci când doriți familia de clase, care au multe în comun. Desigur, acesta poate fi aplicat la interfața, dar apoi au nevoie pentru a scrie o mulțime de cod identice.
În unele limbi (C ++), un cuvânt cheie special pentru a indica nici o interfață.
Putem presupune că orice interfață - aceasta este o clasă abstractă, dar nu și invers.
tl; dr: clasa Abstract - instrument de dezvoltare de clasă la nivelul inferior, mijloace de cod reutilizabile; interfață - un mijloc de exprimare a clasei semantica. Astfel, este complet diferit, un pic concepte care nu au legătură.
O clasă abstractă - un „martor“ de clasă: cele mai multe dintre metodele comune (inclusiv intern), dar câteva. Acestea sunt câteva dintre metodele nerealizate pot fi bine metodele interne ale unei clase, ci doar face detaliile de implementare. O clasă abstractă - un mijloc de a reutiliza de cod, un mijloc pentru a indica ce metodă este necesar să fie închisă pentru a completa clasa de scriere.
Interfața este același - este un tip de contract: interfețele utilizate în definiția pentru a indica faptul că obiectul care urmează să fie utilizat de fapt, trebuie să pună în aplicare (pentru parametrii de intrare) sau este garantat pentru a pune în aplicare (pentru parametrii de ieșire) set de metode și (mai important!) au o anumită semantică. Interfața poate fi bine goală, cu toate acestea, să pună în aplicare interfața înseamnă a menține această semantică.
clase abstracte sunt ideologic similare cu șabloane C ++: atat cele, iar altele sunt clase blank-uri, dar un șablon pentru o clasă trebuie să specificați un tip de șablon, și clasă abstractă - metode abstracte.
Interfețe ideologic similare cu fișier antet C ++: ele dezvăluie metodele secrete și realizare concretă.
Problema dacă interfața sau clasa clasă abstractă proprie - detaliile tehnice de punere în aplicare, în funcție de limbajul de programare special. De exemplu, în interfețele C ++ non-existente, și ei trebuie să imite clase fără date. O clasă abstractă în C ++ în sine este, de asemenea, lipsește, dar ele pot fi considerate ca fiind orice clasă cu metode abstracte. (Prin urmare, restricția de C ++ :. Cel puțin o metodă abstractă în clasa abstractă), este, de asemenea, în C ++, puteți (indirect) la instantia o clasă abstractă, apelați metoda abstractă, și (posibil) a obține o eroare de execuție. În C # interfețe și clase abstracte construite în limba.
Exemplu (în C #, o anumită limbă nu contează):
Mi se pare destul de curios că această întrebare etichetat „OEP“, dar în multe dintre răspunsurile se prelingă în mod clar aspecte specifice ale limbaje de programare specifice. Voi încerca să dea un răspuns bazat pe concepte OOP, și doar apoi pentru a arăta de ce există o diferență a existat în unele limbaje de programare.
clase abstracte și interfețe au o anumită relație cu moștenire, sau mai degrabă în lumea de modelare. Cu ajutorul lor, dorim să exprimăm faptul că un anumit grup de lucruri din sistemul nostru au ceva în comun: un comportament general, care distinge acest grup de toate celelalte Gizmos.
Să presupunem, de exemplu, dorim să simuleze un buton în interfața cu utilizatorul. Din moment ce vorbim despre OEP, vom aloca un anumit tip de butoane cu un anumit set de operațiuni (care determină comportamentul) și latență, care se bazează pe comportamentul (da, latenta nu poate fi). În acest caz, putem distinge trei tipuri de operațiuni:
operațiune specifică fixă, care trebuie să fie absolut stabil pentru toate tipurile de butoane.
operațiune specifică pentru comportamentul implicit (de exemplu, o operațiune a cărei comportament este potrivit pentru mai multe tipuri de butoane, dar poate exista un buton cu un comportament diferit).
Declarația de operațiuni, fără punerea în aplicare specifice (de exemplu, operarea, al căror comportament nu poate fi determinată, pentru că în acest stadiu nu se cunoaște un comportament implicit rezonabil sau operațiuni pot varia prea mult în chei diferite).
Cu alte cuvinte, tipul de chei poate cuprinde metode non-virtuale (metode non-virtuale), metode virtuale (metode virtuale) și metode abstracte (metode abstracte).
Prezența diferitelor tipuri de metode este un instrument foarte important pentru modelarea si permite foarte precis exprimă intenția designerului. De exemplu, putem adăuga operație non-virtuale „prin apăsarea unui buton“, care va delega o parte din activitatea sa la virtual (sau abstract metoda) „trata depresia“, dar transporta întotdeauna o anumită parte a lucrării (cititorul perspicace va vedea în acest model descriere „Metoda Template“ ).
După ce am identificat tipul de bază, este timpul pentru a defini tipurile de arbitrare. Și apoi începe întrebările. Mai precis, fără întrebări apar, cum ar fi atunci când există doar un singur tip de bază sau imediat toate tipurile de bază conține numai declarații de operațiuni. Nu este o problemă, moștenesc „butonul Menu“ la „Butoane“ și suprascrie metoda „Apăsați butonul.“ Dar ce se întâmplă dacă „butonul de meniu“ nostru de tip va otnasledovan două tipuri cu una și aceeași intervenție chirurgicală virtuală? După cum trece peste doar unul și lăsați celălalt? Și cum să fie un nou tip de client și discerne ce operație pe trăgaci? Și dacă cele două tipuri de bază ale unui câmp cu același nume? Și dacă unul dintre metoda de bază de tip „Press“ este realizat, iar celălalt - să fie descrisă doar ca o declarație?
Acum va fi ușor să efectueze diferența dintre cele trei concepte - intferfeysa, o clasă de bază abstractă și o anumită clasă de bază.
Interface - descrie o familie de tipuri și conține o declarație de tranzacții (da, am scrie în mod deliberat cuvântul „declarație“, mai degrabă decât folosind cuvântul „contract“, care OEP are o valoare certă).
Clasa de bază abstractă descrie un anumit tip de familie, dar, în plus față de Declarația de operațiuni pot conține o implementare implicită (metode virtuale) și operațiuni fixe (metode non-virtuale).
O clasă specială descrie anumite tipuri de familie, care este gata pentru a fi utilizat de către clienți. O astfel de clasă nu poate conține operațiuni de declarații și toate operațiunile sale trebuie să fie fie fixe (metode non-virtuale) sau să conțină o implementare implicită (metode virtuale). Există o altă subspecii de clase specifice - sigilate (sigilate) clasă - un fel de o anumită clasă otnasledovatsya din care este imposibil, și, prin urmare, poate conține operațiuni numai specifice.
Interfețe, în funcție de natura lor, au mai puțin de conectivitate (cuplare scăzută), deoarece nu are un comportament specific care ar putea complica viața subclasă. Interfețele poate simula, de asemenea, relația „este“ ( „Butonul Menu“ este „IKnopkoy“), dar poate detecta și atitudine mai puțin rigidă „poate servi drept» (CAN DO). De exemplu, interfața de BCL IEquatable definește comportamentul „suplimentar“, ceea ce sugerează posibilitatea de a compara valorile de tipuri de obiecte.
Să ordine. Interface - un contract / obyazatelstva care presupune clasă și obligat să le îndeplinească. Să presupunem că: există o serie de clase care știu cum să spun salut
Acum, orice clasă, indiferent de complexitatea și domeniul de aplicare al ierarhiei sale poate moșteni (pentru a lua obyazatelstvo / semna un contract pentru executarea) a acestei metode, și, astfel, „va fi al lui, prin alții.“ Cea mai bună parte este că, indiferent cât de extinsă, indiferent de interfață (în acest context, există metode publice ale unei clase), clasa care execută contractul - este doar o singură metodă se va vedea din această matrice. Exemplu: există o mulțime de clase grafice, iar unele dintre ele vă va învăța să răspundă la Blur - împinge-le într-o serie de interfețe și, dacă este necesar, apelul Blur Method (valoarea int); Când se utilizează interfața, am face abstracție de faptul că, pentru clasa de: mașini, aer comprimat. Dacă el sa angajat să fie realizarea „Salutați“ avem o garanție. că această metodă va fi disponibil pentru noi prin obiect (un pointer la această clasă) (amintiți-vă chistovirtualnye metode de interfață în secțiunea publice, fără variabile).
Și acum de altă parte, C ++, cu toată puterea sa nu are nici o idee asupra nivelului de limbă a interfeței. Dar programatorii sunt obișnuiți cu interfața, este convenabil, este sigur (citit despre Insersion de control) și dreapta (în termeni de arhitectură). Trebuie să pună în aplicare „interfață“ cu instrumentele pe care le oferă C ++ - este pe o clasă abstractă. După cum puteți vedea, acolo este posibil pentru a împinge diferitele metode (publice / protejate / private), clasa Membury (în alte limbi pentru variabilele din interfața este problema). Ar fi cuvântul cheie de interfață în C ++ și a fost moștenită ar dori în mod clar în C # - acest lucru ar fi datorii confuzie. clase abstracte, pur și simplu, și se aplică în cazurile de alocare din totalul claselor, dar cele mai multe din această clasă cum ar trebui să fie (este lipsit de sens să aibă o copie a acestui Klas).
Ca un exemplu, vom descrie o clasă de minge și un pepene verde, găsi similitudini, au văzut că le-ar descrie în continuare obiecte circulare. Selectați Toate acestea într-o clasă generală și a făcut un rezumat, pentru că ceea ce în sistem pentru a fi în măsură să aibă o clasă de „ceva rotund, și cu o greutate te poate arunca.“
clasa cu o funcție / caracteristică virtuală este numit - abstract
clasă abstractă poate avea una sau mai multe funcții pur virtuale
în cazul în care o clasă abstractă are cel puțin o funcție pur virtuală, obiectul acestei clase nu poate fi creată, ci doar să moștenească și funcțiile virtuale pure ar trebui redefinit în viitor.
interfață de clasă - această instrucțiune / acord cu modul în care un programator programator poate utiliza această clasă. și anume Se pare interfata - totul deschis de date (publică), care poate transforma programator.
de fapt, a scris că @VladD numai limbaj simplu