Diferență între revizuiri ale paginii „Noțiuni avansate de programare obiect-orientată”
Linia 122: | Linia 122: | ||
Schema bloc a ierarhiei este prezentată mai jos: | Schema bloc a ierarhiei este prezentată mai jos: | ||
− | [[Fișier:ierarhie.png|600px|Ierarhia claselor implementate mai sus]] | + | |
+ | |||
+ | [[Fișier:ierarhie.png|600px|text-top|Ierarhia claselor implementate mai sus]] | ||
<div class="regula"><font color="#ff0000">Regulă:</font> O clasă Java extinde exact o singură altă clasă (dacă nu este specificată, aceasta este clasa [http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html Object]).</div> | <div class="regula"><font color="#ff0000">Regulă:</font> O clasă Java extinde exact o singură altă clasă (dacă nu este specificată, aceasta este clasa [http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html Object]).</div> | ||
Linia 128: | Linia 130: | ||
<div class="regula"><font color="#ff0000">Regulă:</font> 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. </div> | <div class="regula"><font color="#ff0000">Regulă:</font> 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. </div> | ||
+ | |||
+ | 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ă. | ||
+ | |||
+ | <div class="regula"><font color="#ff0000">Regulă:</font> Î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).</div> | ||
+ | |||
+ | 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] | ||
=== Polimorfism === | === Polimorfism === | ||
== Încapsulare == | == Încapsulare == |
Versiunea de la data 21 august 2012 09:19
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: