Trece peste

De la Wikipedia, enciclopedia liberă.
Salt la navigare Salt la căutare

În programarea orientată obiect, suprascrierea este operația de rescriere a unei metode moștenite.

În programarea orientată pe obiecte, posibilitatea de a crea clase pornind de la clase deja existente ( moștenire ) își asumă o importanță considerabilă. Noua clasă care moștenește cea existentă poate avea metode moștenite care pot fi rescrise pentru noi nevoi.

Exemplu în java

Să definim acum prima clasă, Punto :

 public class Point {
     private int a , b ;

     punct public ( int a , int b ) { 
           aceasta . a = a ;
           aceasta . b = b ;
    }

     public void setA ( int a ) {
           aceasta . a = a ;
    }

     public int getA () {
           reveni la ;
    }

     public void setB ( int b ) {
           aceasta . b = b ;
    }

     public int getB () {
           retur b ;
    }

     public dublă origine_distanță () {
           int x = ( a * a ) + ( b * b );
           returnează matematica . sqrt ( x );
    }

}

Acum să implementăm în Punto3D clasa Punto3D care moștenește din clasa Punto

 clasa publică Punto3D extinde Punto {
     private int c ;

     public Punto3D ( int a , int b , int c ) { 
           super ( a , b );
           aceasta . c = c ;
    }

     public void setC ( int c ) {
           aceasta . c = c ;
    }

     public int getC () {
           retur c ;
    }

     public dublă origine_distanță () {
           int x = ( getA () * getA ()) + ( getB () * getB ()) + ( c * c );
           returnează matematica . sqrt ( x );
    }

}

A fost posibilă redefinirea blocului de cod al Punto3D distanza_origine() pentru a introduce a treia coordonată (variabila c), astfel încât calculul distanței să fie efectuat corect în clasa Punto3D . Apelul către constructorul superclasei a avut loc printr-o sintaxă specială care folosește super . Această instrucțiune ( super(a,b) ) trebuie să fie prima dintre constructori și nu poate fi inserată în interiorul unei metode care nu este un constructor.

Anularea impune câteva reguli de urmat:

  • Metoda redefinită are aceeași formă ca metoda originală a superclasei;
  • Metoda redefinită în subclasă nu trebuie să fie mai puțin accesibilă decât metoda originală a superclasei. De exemplu, dacă o metodă moștenită este declarată protejată, aceasta nu poate fi redefinită ca privată, dacă este ceva, publică;
  • Tipul returnat al metodei trebuie să se potrivească cu cel al metodei pe care o rescrieți.

De fapt, începând cu versiunea 5 a java, tipul returnat al metodei poate coincide și cu o subclasă a tipului returnat al metodei originale. În acest caz vorbim de „tip de revenire covariantă”. De exemplu, luând în considerare întotdeauna relația de moștenire care există între clasele Punto și Punto3D , dacă următoarea metodă a fost prezentă în clasa Punto :

 punct public getAddress () {
     returnează acest lucru ;
    }

atunci ar fi legal să implementăm următoarea suprascriere în clasa Punto3D

 public Punto3D getAddress () {
     returnează acest lucru ;
    }

Anulați adnotarea

Una dintre cele mai frecvente greșeli pe care le poate face un programator este lipsa unei suprascrieri. Aceasta înseamnă a redefini incorect o metodă pe care doriți să o rescrieți într-o subclasă, probabil prin tastarea unei litere mici, mai degrabă decât una cu majuscule sau prin greșirea numărului de parametri de intrare. în astfel de cazuri, compilatorul nu va raporta erori, deoarece nu poate ghici încercarea de suprascriere în curs. Deci, de exemplu, următorul cod în java:

 clasă publică MyClass {
     ...
     public String tostring () { // pentru a avea suprascrierea, ar trebui să scrieți la String și nu tostring
           ...
    }
}

este completat corect, dar nu va exista nicio suprascriere în MiaClasse . Marea problemă este că această eroare va apărea în timp de execuție și nu înseamnă că o puteți remedia rapid. Pentru a rezolva această problemă, trebuie să utilizați adnotarea Override prezentă în java.lang. . Această adnotare servește pentru a marca metodele pe care doresc să fie rescrierea metodelor moștenite. Necesită utilizarea unui caracter complet nou pentru sintaxa Java: @ . În exemplul nostru, metoda va fi marcată după cum urmează:

 clasă publică MyClass {
     ...
     @Trece peste
     public String toString () { 
           ...
    }
}

Dacă se încalcă oricare dintre regulile de suprascriere, vom primi o eroare direct în compilare. A avea o eroare de compilare, desigur, este mult mai bine decât să o aveți în timpul rulării.