Diferență între revizuiri ale paginii „Noțiuni avansate de programare obiect-orientată”

De la WikiLabs
Jump to navigationJump to search
Linia 138: Linia 138:
  
 
Mai multe despre moștenire și suprascriere/ ascundere pe pagina oficială Oracle:
 
Mai multe despre moștenire și suprascriere/ ascundere pe pagina oficială Oracle:
* [http://docs.oracle.com/javase/tutorial/java/IandI/subclasses.html]
+
* http://docs.oracle.com/javase/tutorial/java/IandI/subclasses.html
* [http://docs.oracle.com/javase/tutorial/java/IandI/override.html]
+
* http://docs.oracle.com/javase/tutorial/java/IandI/override.html
  
 
=== Polimorfism ===
 
=== Polimorfism ===
  
 
== Încapsulare ==
 
== Încapsulare ==

Versiunea de la data 21 august 2012 09:20

Ierarhii de clase

Una din cele mai utile facilități ale unui limbaj orientat obiect, din punct de vedere al ușurinței de a citi și menține o aplicație, este aceea de a crea o ierarhie de clase. Particularitățile unei ierarhii de clase sunt:

  • o clasă poate extinde o altă clasă, moștenind din funcționalitatea acesteia din urmă;
  • un obiect instanțiat dintr-o clasă B care este extinsă dintr-o clasă A, este în același timp de tip B dar și de tip A (polimorfism).

Moștenire

Conceptul de moștenire este util atunci când programatorul are nevoie de o anumită funcționalitate care parțial este deja implementată într-o alta clasă. Astfel, acele bucăți de program nu mai trebuie reimplementate și testate ci doar completate.

Putem lua ca exemplu o clasă Vehicle:

public class Vehicle{

    public static final float MAX_VEHICLE_SPEED = 300;

    protected float currentSpeed;
    private String name;
    private String color;

public Vehicle(String _name, String _color){
    name = _name;
    color = _color;
}

public void increaseSpeedBy(float _speed){
    if(currentSpeed + _speed <= MAX_VEHICLE_SPEED){
        currentSpeed += _speed;
    }
}

public String getName(){
    return name;
}

public String getColor(){
    return color;
}

public float getCurrentSpeed(){
    return currentSpeed;
}

}

... și trei clase extinse: Carriage

public class Carriage extends Vehicle{

    public static final float MAX_VEHICLE_SPEED = 40;

    private int horseCount;

public Carriage(String _color, int _horseCount){
    super("Carriage", _color);
    horseCount = _horseCount;
}

public int getHorseCount(){
    return horseCount();
}

}

... Automobile:

public class Automobile extends Vehicle{

    public static final float MAX_VEHICLE_SPEED = 250;

    private int cylinders;
    private String make;
    private String model; 

public Autombile(String _make, String _model, String _color, int _cylinders){
    super("Automobile", _color);
    make = _make;
    model = _model;
    cylinders = _cylinders;
}

public int getCylinders(){
    return cylinders;
}

public String getMake(){
    return make;
}

public String getModel(){
    return model;
}

}

... și Truck:

public class Truck extends Automobile{

    public static final float MAX_VEHICLE_SPEED = 150;
    private int maxCargo;

public Truck(String _make, String _model, String _color, int _cylinders, int _maxCargo){
    super(_make, _model, _color, _cylinders);
    maxCargo = _maxCargo;
}

public int getMaxCargo(){
    return maxCargo;
}

public String getName(){
    return "Truck";
}

}

Schema bloc a ierarhiei este prezentată mai jos:


Ierarhia claselor implementate mai sus

Regulă: O clasă Java extinde exact o singură altă clasă (dacă nu este specificată, aceasta este clasa Object).


Regulă: O clasă moștenește de la superclasă doar metodele și câmpurile non-statice, declarate public, protejate sau implicite. O clasă nu moștenește membrii privați și statici, și constructorii.

Există două noțiuni foarte importante legate de extinderea claselor: suprascriere și ascundere (overriding & hiding):

  • suprascrierea unei metode se referă la definirea în clasa extinsă a unei metode ne-statice cu aceeași semnătură (prototip) cu o metodă ne-statică din clasa de bază;
  • ascunderea unei metode se referă la definirea în clasa extinsă a unei metode statice cu aceeași semnătură (prototip) cu o metodă statică din clasa de bază.
Regulă: Întotdeauna când o metodă este apelată folosind o referință la un obiect, metoda apelată este cea care suprascrie ultima, indiferent de tipul variabilei referință (polimorfism).

Mai multe despre moștenire și suprascriere/ ascundere pe pagina oficială Oracle:

Polimorfism

Încapsulare