Articles

conceptul OOP pentru începători: Ce este moștenirea?

moștenirea este unul dintre conceptele de bază ale limbajelor de programare orientate pe obiecte (OOP). Este un mecanism în care puteți obține o clasă dintr-o altă clasă pentru o ierarhie de clase care împărtășesc un set de atribute și metode.puteți să-l utilizați pentru a declara diferite tipuri de excepții, pentru a adăuga logică personalizată la cadrele existente și chiar pentru a mapa modelul dvs. de domeniu într-o bază de date.,

declarați o ierarhie de moștenire

în Java, fiecare clasă poate fi derivată dintr-o altă clasă. Acea clasă se numește superclasă sau clasă părinte. Clasa derivată se numește subclasă sau clasă copil.

utilizați cuvântul cheie se extinde pentru a identifica clasa pe care o extinde subclasa. Dacă nu declarați o superclasă, clasa dvs. extinde implicit obiectul clasei. Obiectul este rădăcina tuturor ierarhiilor de moștenire; este singura clasă din Java care nu extinde o altă clasă.

următoarea diagramă și fragmente de cod arată un exemplu de ierarhie simplă a moștenirii.,

clasa BasicCoffeeMachine nu declară o superclasă și extinde implicit obiectul clasei. Puteți clona proiectul CoffeeMachine exemplu pe GitHub.

clasa PremiumCoffeeMachine este o subclasă a clasei BasicCoffeeMachine.modificatorii de acces definesc ce clase pot accesa un atribut sau o metodă. Într-una din postările mele anterioare despre încapsulare, v-am arătat cum le puteți folosi pentru a implementa un mecanism de ascundere a informațiilor. Dar acesta nu este singurul caz în care trebuie să fiți familiarizați cu diferiți modificatori., Acestea afectează, de asemenea, entitățile și atributele pe care le puteți accesa într-o ierarhie de moștenire.

Iată o prezentare rapidă a diferiților modificatori:

  • atributele sau metodele Private pot fi accesate numai în cadrul aceleiași clase.
  • atributele și metodele fără modificator de acces pot fi accesate în cadrul aceleiași clase și de către toate celelalte clase din același pachet.
  • atributele sau metodele protejate pot fi accesate în cadrul aceleiași clase, de către toate clasele din același pachet și de către toate subclasele.,
  • atributele și metodele publice pot fi accesate de toate clasele.după cum puteți vedea în această listă, o subclasă poate accesa toate atributele și metodele protejate și publice ale superclasei. Dacă subclasa și superclasa aparțin aceluiași pachet, subclasa poate accesa, de asemenea, toate atributele și metodele pachetelor private ale superclasei.

    fac asta de două ori în constructorul clasei PremiumCoffeeMachine.

    folosesc mai întâi cuvântul cheie super pentru a apela constructorul superclasei. Constructorul este public, iar subclasa îl poate accesa., Cuvântul cheie super face referire la superclasă. Puteți să-l utilizați pentru a accesa un atribut sau pentru a apela o metodă a superclasei care este suprascrisă de subclasa curentă. Dar mai multe despre asta în secțiunea următoare.

    atributul protejat configMap este definit de clasa BasicCoffeeMachine. Prin extinderea acelei clase, atributul devine, de asemenea, parte a clasei PremiumCoffeeMachine și pot adăuga configurația necesară pentru a prepara un espresso pe hartă.,moștenirea nu numai că adaugă toate metodele publice și protejate ale superclasei la subclasa dvs., dar vă permite, de asemenea, să înlocuiți implementarea acestora. Metoda subclasei o înlocuiește apoi pe cea a superclasei. Acest mecanism se numește polimorfism.

    folosesc asta în clasa PremiumCoffeeMachine pentru a extinde capacitățile de preparare a cafelei mașinii de cafea. Metoda brewCoffee a metodei BasicCoffeeMachine poate prepara numai cafea filtrantă.am suprascrie această metodă în clasa PremiumCoffeeMachine pentru a adăuga suport pentru CoffeeSelection.,ESPRESSO. După cum puteți vedea în fragmentul de cod, cuvântul cheie super este foarte util dacă înlocuiți o metodă. Metoda brewCoffee a Principaluluicoffeemachine se ocupă deja de Cafeaeselecție.FILTER_COFFEE și aruncă o CoffeeException pentru CoffeeSelections neacceptate.

    pot reutiliza asta în noua mea metodă brewCoffee. În loc să reimplementez aceeași logică, verific doar dacă selecția de cafea este ESPRESSO. Dacă nu este cazul, folosesc cuvântul cheie super pentru a apela metoda brewCoffee a superclasei.,dacă doriți să vă asigurați că nicio subclasă nu poate modifica implementarea unei metode, o puteți declara finală. În exemplul acestui post, am făcut asta pentru metoda addBeans a clasei BasicCoffeeMachine.este adesea o idee bună de a face toate metodele finale care sunt numite de un constructor. Împiedică orice subclasă să schimbe, adesea neintenționat, comportamentul constructorului.,

    o subclasă este, de asemenea, de tipul superclasei sale

    o subclasă nu numai că moștenește atributele și metodele superclasei, dar moștenește și tipurile superclasei. În exemplu, BasicCoffeeMachine este de tip BasicCoffeeMachine și obiect. Și un obiect PremiumCoffeeMachine este de tipurile PremiumCoffeeMachine, BasicCoffeeMachine și Object.din acest motiv, puteți arunca un obiect PremiumCoffeeMachine pentru a tasta BasicCoffeeMachine.

    BasicCoffeeMachinee coffeeMachine = (BasicCoffeeMachine) PremiumCoffeeMachine(beans);

    care vă permite să scrie cod care utilizează superclasa și executa-l cu toate subclasele.,

    în acest exemplu, codul metodei createCoffeeMachine revine și metoda makeCoffee utilizează clasa BasicCoffeeMachine. Dar metoda createCoffeeMachine instanțiază un nou obiect PremiumCoffeeMachine. Când este returnat prin metoda, obiectul este aruncat automat la BasicCoffeeMachine și Codul poate apela toate metodele publice ale clasei BasicCoffeeMachine.

    coffeeMachine obiect devine aruncat la BasicCoffeeMachine, dar este încă un PremiumCoffeeMachine., Deci, atunci când metoda makeCoffee numește metoda brewCoffee, se numește metoda suprascrisă pe clasa PremiumCoffeeMachine.

    definirea claselor abstracte

    clasele abstracte sunt diferite de celelalte clase despre care am vorbit. Ele pot fi extinse, dar nu instanțiate. Acest lucru le face ideale pentru a reprezenta generalizări conceptuale care nu există în domeniul dvs. specific, dar vă permit să reutilizați părți ale codului dvs.

    utilizați cuvântul cheie abstract pentru a declara o clasă sau o metodă ca fiind abstractă. O clasă abstractă nu trebuie să conțină metode abstracte., Dar o metodă abstractă trebuie declarată de o clasă abstractă.

    Să refactor mașină de cafea exemplu și să introducă AbstractCoffeeMachine clasa ca superclasa a BasicCoffeeMachine clasa. Declar această clasă ca fiind abstractă și definesc metoda abstractă brewCoffee.

    public abstract class AbstractCoffeeMachine { protected Map<CoffeeSelection, Configuration> configMap; public AbstractCoffeeMachine() { this.configMap = new HashMap<CoffeeSelection, Configuration>(); } public abstract Coffee brewCoffee(CoffeeSelection selection) throws CoffeeException; }

    după cum puteți vedea, nu ofer corpul metodei abstracte brewCoffee. O declar așa cum aș face într-o interfață., Când extindeți clasa AbstractCoffeeMachine, va trebui să definiți subclasa ca abstractă sau să înlocuiți metoda brewCoffee pentru a implementa corpul metodei.

    fac unele modificări minore la clasa BasicCoffeeMachine. Acum extinde clasa AbstractCoffeeMachine, iar metoda brewCoffee deja existentă înlocuiește metoda abstractă a superclasei.un alt lucru pe care l-am schimbat este constructorul clasei BasicCoffeeMachine. Acum apelează constructorul superclasei și adaugă o pereche de valori cheie la atributul configMap fără a instantia harta., Este definit și instanțiat de superclasa abstractă și poate fi utilizat în toate subclasele.aceasta este una dintre principalele diferențe dintre o superclasă abstractă și o interfață. Clasa abstractă nu numai că vă permite să declarați metode, dar puteți defini și atribute care nu sunt statice și finale.după cum ați văzut, moștenirea este un concept puternic care vă permite să implementați o subclasă care extinde o superclasă. Prin aceasta, subclasa moștenește toate atributele și metodele protejate și publice și tipurile superclasei., Puteți utiliza apoi atributele moștenite ale superclasei, utilizați sau suprascrieți metodele moștenite și aruncați subclasa la orice tip de superclasă.

    puteți utiliza o clasă abstractă pentru a defini o abstracție generală care nu poate fi instanțiată. În cadrul acestei clase, puteți declara metode abstracte care trebuie înlocuite de subclase non-abstracte. Aceasta este adesea folosită dacă implementarea acelei metode este specifică pentru fiecare subclasă, dar doriți să definiți un API general pentru toate clasele ierarhiei.