Atunci când se extinde metode nu pot trece peste, iar dacă metodele implementează necesare pe care doriți să înlocuiți, așa că de ce nu prevalează, în cazul în care este posibil să se creeze o metodă directă în clasele potrivite. Pur și simplu, eu nu înțeleg destul de modul de a face API), probabil, doar a fugit în probleme care sunt rezolvate clase abstracte și interfețe)
Atunci când se extinde metode nu pot trece peste - numai în cazul în care moștenit de o anumită clasă (de exemplu, în cazul în care au undeva definite o singură dată)! În cazul în care, cu toate acestea, derivă din clasa abstractă, fie el însuși moștenind clasă trebuie să fie încă abstractă sau încă mai trebuie să pună în aplicare metoda :) Aici sunt dotate cu destul de diferit!
Moștenind de la o clasă abstractă vă permite să „frotiu“ punerea în aplicare a metodelor individuale, prin diferite niveluri de moștenire. La fiecare implementiruem nivel care se referă la acestea, precum și alte metode de a le părăsi abstract și implementiruem la alte niveluri.
Interfața necesită, de asemenea, desigur, să pună în aplicare toate - atunci el și de contract. Deci, interfața este utilizată pentru a asigura contractul, și o clasă abstractă - pentru structurarea punerea în aplicare a acestui contract.
Acum există o discuție Care este interfața de programare?
Aș spune că interfața este un contract între straturile de aplicare. Ai straturi tao, serviciile pot sekyureti și altceva. există interfețe între ele. Acest lucru înseamnă că puteți înlocui punerea în aplicare a punerii în aplicare a celuilalt strat fără dificultate. De exemplu, ceva de genul asta atunci când se face primăvară creează un strat suplimentar pentru gestionarea tranzacției pe Tao. Doar este convenabil pentru testare atunci când testul pe care scrie obiect Mock
Full-stivă dezvoltator (Symfony, unghiular)
Un exemplu clasic - clasa logger. Puteți pur și simplu nu fac baie și de a face clasa Logger cu punerea sa în aplicare, și peste tot în codul de client (de exemplu, codul care va utiliza această clasă) să se angajeze pe această clasă.
Dar hark, acum jurnalele, ar trebui să nu fie stocate în fișiere și în baza de date, așa dintr-o dată. Am schimbat constructorul, am schimbat punerea în aplicare a tuturor metodelor (presupunând că l-am avea unul, log (string mesaj, nivel int, categoria string);
Și este bine dacă am respectat principiul dependenței inversiune, atunci faptul că am schimbat constructorul nu va afecta klientsokom codul, de exemplu, doar dat la el și el nu știe nimic despre cum să creați cele de mai sus. Dar noi DeLeMa se ridică sau search-mă înlocui tip în codul de client, sau moștenite, și pur și simplu să înlocuiască punerea în aplicare. În acest sens, moștenirea va funcționa așa cum ne-o dorim, dar de ce?
Cu interfața, avem o interfață frumoasă, este punerea sa în aplicare, în cazul în care avem un container de dependență putem lega o implementare specifică a interfeței, și în cazul în care este necesar, această interfață va împins automat la punerea în aplicare dorită. Înlocuirea de implementare - schimbare DI configurare.
Deci, dacă aveți nevoie pentru a schimba frecvent interfața pe care aveți unele probleme cu arhitectura clădirii. Interfața trebuie să fie simplă și ar trebui să facă un singur lucru.
În general, citiți despre GRASP și solide.
Dependență Inversion, configurația DI, arhitectura - sunteți sigur că persoana care a pus această întrebare să înțeleagă aceste lucruri? = D în afară de răspunsul tău este puternic legat de IoC și DI, adică cel mai puțin deasupra capului în a răspunde la întrebarea „Care sunt interfețele“.
@NekitoSP ai dreptate) La partea de jos explicația chiar mai rău)
Interface - un contract prin care interacționează cu codul.
De ce am nevoie pentru a semna un contract în cazul în care nu pot contracta în mod normal, crea metode și de a lucra cu ei. Se obține prin extinderea în continuare a codului cu interfata este user-friendly. Am înțeles bine?