limbaje de programere java

8
Laborator 4 – Limbaje de programare Reutilizarea codului 1. Sintaxa compozi ției – compozitia obiectelor are loc atunci cand se plaseaza o referinta catre un obiect existent intr-o clasa noua. class WaterSource { private String s; WaterSource() { System.out.println("WaterSource()"); s = "Constructed"; } public String toString() { return s; } } public class SprinklerSystem { private String valve1, valve2, valve3, valve4; // se face compozitie:un obiect din clasa WaterSource ca si atribut private WaterSource source = new WaterSource(); //se apeleaza contructor private int i; private float f; public String toString() { //mecanism de conversie inspre clasa String return "valve1 = " + valve1 + " " + "valve2 = " + valve2 + " " + "valve3 = " + valve3 + " " + "valve4 = " + valve4 + "\n" + "i = " + i + " " + "f = " + f + " " + "source = " + source; } public static void main(String[] args) { SprinklerSystem sprinklers = new SprinklerSystem(); System.out.println(sprinklers); //se printeaza continutul obiectului //se face conversie conform metodei toString() } } /* Output: WaterSource() valve1 = null valve2 = null valve3 = null valve4 = null i = 0 f = 0.0 source = Constructed *///: Atentie la metoda toString!!! Reprezentare schematica:

Upload: madalina-mada

Post on 23-Nov-2015

83 views

Category:

Documents


8 download

DESCRIPTION

Java

TRANSCRIPT

  • Laborator 4 Limbaje de programare

    Reutilizarea codului 1. Sintaxa compoziiei compozitia obiectelor are loc atunci cand se plaseaza o referinta

    catre un obiect existent intr-o clasa noua.

    class WaterSource { private String s; WaterSource() { System.out.println("WaterSource()"); s = "Constructed"; } public String toString() { return s; } } public class SprinklerSystem { private String valve1, valve2, valve3, valve4; // se face compozitie:un obiect din clasa WaterSource ca si atribut private WaterSource source = new WaterSource(); //se apeleaza contructor private int i; private float f; public String toString() { //mecanism de conversie inspre clasa String return "valve1 = " + valve1 + " " + "valve2 = " + valve2 + " " + "valve3 = " + valve3 + " " + "valve4 = " + valve4 + "\n" + "i = " + i + " " + "f = " + f + " " + "source = " + source; } public static void main(String[] args) { SprinklerSystem sprinklers = new SprinklerSystem(); System.out.println(sprinklers); //se printeaza continutul obiectului //se face conversie conform metodei toString() } } /* Output: WaterSource() valve1 = null valve2 = null valve3 = null valve4 = null i = 0 f = 0.0 source = Constructed *///: Atentie la metoda toString!!!

    Reprezentare schematica:

  • 2. Sintaxa mostenirii cuvntul cheie extends

    //: reusing/Detergent.java // Inheritance syntax & properties. class Cleanser { private String s = "Cleanser"; public void append(String a) { s += a; } public void dilute() { append(" dilute()"); } public void apply() { append(" apply()"); } public void scrub() { append(" scrub()"); } public String toString() { return s; } public static void main(String[] args) { Cleanser x = new Cleanser(); x.dilute(); x.apply(); x.scrub(); System.out.println(x); } } public class Detergent extends Cleanser { // schimbarea functionalitatii metodei scrub() din clasa de baza public void scrub() { append(" Detergent.scrub()");//metoda append din clasa de baza super.scrub(); // apel metoda scrub() din clasa de baza } // Adaugarea de metode specifice clasei derivate public void foam() { append(" foam()"); } // Test the new class: public static void main(String[] args) { //Detergent are toate metodele din clasa de baza //+noile metode implemenate sau suprascrise in Detergent Detergent x = new Detergent(); x.dilute(); // x.apply(); x.scrub(); x.foam(); System.out.println(x); System.out.println("Testing base class:"); Cleanser.main(args); //apel metoda main - statica } } /* Output: Cleanser dilute() apply() Detergent.scrub() scrub() foam() Testing base class: Cleanser dilute() apply() scrub() *///:~

    In clasa derivata se preiau doar atributele si metodele publice sau protected din clasa de baza.

  • Reprezentare schematica a mostenirii:

    3. Apel constructor clas de baz cu argumente

    class Game { Game(int i) { System.out.println("Game constructor"); } } class BoardGame extends Game { //clasa derivata din Game BoardGame(int i) { super(i); //apel constructor clasa de baza (Game) System.out.println("BoardGame constructor"); } } public class Chess extends BoardGame { Chess() { super(11); //apel constructor clasa de baza BoardGame System.out.println("Chess constructor"); } public static void main(String[] args) { Chess x = new Chess(); } } /* Output: Game constructor BoardGame constructor Chess constructor *///:~ 4. Creati o clas de baz care s aib un constructor cu argumente. Clasa nu are constructor default.

    Creati o clas derivat care are atat constructor default (fr argumente) ct i constructor cu

    argumente. In constructorii clasei derivate, apelati constructorul clasei de baz. 5. Se creaz o clas Root care contine instante ale claselor Component1, Component2 si Component3. Se creaz o clas Stem derivat din Root, care la rndul ei agreg din clasele

  • Component1, Component2 si Component3. Fiecare clas are un constructor default care afiseaz un

    mesaj. Artati ordinea de initializare a obiectelor in cazul combinarii mostenirii cu agregarea. 6. Operatia de delegare plasarea unui obiect membru intr-o clasa noua (ca si la compozitie) si expunerea tuturor metodelor din obiectul membru in clasa noua (ca si mostenirea). public class SpaceShipControls { void up(int velocity) {} void down(int velocity) {} void left(int velocity) {} void right(int velocity) {} void forward(int velocity) {} void back(int velocity) {} void turboBoost() {} } ///:~ //: reusing/SpaceShipDelegation.java public class SpaceShipDelegation { private String name; //compozitie cu clasa SpaceShipControls private SpaceShipControls controls = new SpaceShipControls(); public SpaceShipDelegation(String name) { this.name = name; //utilizarea this pentru a diferentia argumentul de atributul clasei } // metode delegate - din clasa SpaceShipControls public void back(int velocity) { controls.back(velocity); } public void down(int velocity) { controls.down(velocity); } public void forward(int velocity) { controls.forward(velocity); } public void left(int velocity) { controls.left(velocity); } public void right(int velocity) { controls.right(velocity); } public void turboBoost() { controls.turboBoost(); } public void up(int velocity) { controls.up(velocity); } public static void main(String[] args) { SpaceShipDelegation protector = new SpaceShipDelegation("NSEA Protector"); protector.forward(100); } }

  • Clasa SpaceShipDelegation implementeaza aceiasi interfata ca si a clasei SpaceShipControls, fiecare metoda forward-eaza executia la clasa cu care se face compozitie. Utilizand Delegation, programatorul are mai mult control decat in cazul mostenirii.

    7. Combinarea compozitiei cu mostenirea //: reusing/PlaceSetting.java // Combining composition & inheritance. class Plate { Plate(int i) { System.out.println("Plate constructor"); } } class DinnerPlate extends Plate { DinnerPlate(int i) { super(i); System.out.println("DinnerPlate constructor"); } } class Utensil { Utensil(int i) { System.out.println("Utensil constructor"); } } class Spoon extends Utensil { Spoon(int i) { super(i); System.out.println("Spoon constructor"); } } class Fork extends Utensil { Fork(int i) { super(i); System.out.println("Fork constructor"); } } class Knife extends Utensil { Knife(int i) { super(i); System.out.println("Knife constructor"); } }

  • // A cultural way of doing something: class Custom { Custom(int i) { System.out.println("Custom constructor"); } } public class PlaceSetting extends Custom { private Spoon sp; //compozitie cu Spoon private Fork frk; //compozitie cu Fork private Knife kn; private DinnerPlate pl; public PlaceSetting(int i) { super(i + 1); //(1) contructor clasa de baza Custom sp = new Spoon(i + 2); //apelul constructorului Spoon va fi precedat de apelul constructorului clasei de baza - Utensil frk = new Fork(i + 3); //idem kn = new Knife(i + 4); //idem pl = new DinnerPlate(i + 5); //apel contructor DinnerPlate precedat de apel constructor clasa de baza System.out.println("PlaceSetting constructor"); } public static void main(String[] args) { PlaceSetting x = new PlaceSetting(9); } }

  • 8.Upcast apare in contextul mostenirii claselor si reprezinta relatia dintre clasa de baza si clasa derivata: Clasa derivata este un nou tip al clasei de baza. (obiectele din clasa derivata sunt in acelasi timp si de tipul clasei de baza). //: reusing/Wind.java // Inheritance & upcasting. class Instrument { //clasa de baza public void play() {} static void tune(Instrument i) { // ... i.play(); } } // Wind objects are instruments // because they have the same interface: public class Wind extends Instrument { public static void main(String[] args) { Wind flute = new Wind(); //wind e si de tipul clasei de baza - Instrument Instrument.tune(flute); // Upcasting !!! aici e upcast } } ///:~ 9. Stergerea obiectelor asigurat in clauza finally a try-catch global class Shape { Shape(int i) { System.out.println("Shape constructor"); } void dispose() { System.out.println("Shape dispose"); } } class Circle extends Shape { Circle(int i) { super(i); System.err.println("Drawing Circle"); } void dispose() { System.out.println("Erasing Circle"); super.dispose(); } } class Triangle extends Shape { Triangle(int i) { super(i); System.out.println("Drawing Triangle"); } void dispose() { System.out.println("Erasing Triangle"); super.dispose(); } } class Line extends Shape { private int start, end; Line(int start, int end) { super(start); this.start = start; this.end = end; System.out.println("Drawing Line: " + start + ", " + end); }

  • void dispose() { System.out.println("Erasing Line: " + start + ", " + end); super.dispose(); // super.dispose e ultima instructiune din dispose-ul clasei derivate/compuse } } public class CADSystem extends Shape { private Circle c; private Triangle t; private Line[] lines = new Line[3]; public CADSystem(int i) { super(i + 1); for(int j = 0; j < lines.length; j++) lines[j] = new Line(j, j*j); c = new Circle(1); t = new Triangle(1); System.out.println("Combined constructor"); } public void dispose() { System.out.println("CADSystem.dispose()"); // The order of cleanup is the reverse // of the order of initialization: t.dispose(); c.dispose(); for(int i = lines.length - 1; i >= 0; i--) lines[i].dispose(); super.dispose(); } public static void main(String[] args) { CADSystem x = new CADSystem(47); try { // Code and exception handling... } finally { // aici e finally de la try-catch global x.dispose(); /*codul din finally este intotdeauna executat chiar daca in program a aparut o exceptie */ } } }