Noțiuni avansate de programare obiect-orientată
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:
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ă.
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/override.html