====== 5 - Skládání objektů versus dědičnost ======
Stáhněte si archiv se šablonami tříd pro {{:courses:a7b36omo:labs:seminar5.zip|5. cvičení}}.
===== 1. úloha na cvičení =====
* Implementujte třídu **''Bag''**.
/**
* Trida Bag reprezentuje kolekci cisel s opakovanim,
* dvakrat vlozene cislo je tam dvakrat a je ho potreba dvakrat vyjmout.
*/
class Bag {
int[] contents = new int[1000];
int size = 0;
void add(int e) {
throw new UnsupportedOperationException("naimplementujte!");
}
boolean contains(int e) {
throw new UnsupportedOperationException("naimplementujte!");
}
int indexOf(int e) {
throw new UnsupportedOperationException("naimplementujte!");
}
void remove(int e) {
throw new UnsupportedOperationException("naimplementujte!");
}
}
* Implementuje třídu **''Set''**.
/**
* Trida Set reprezentuje mnozinu cisel, dvakrat vlozene cislo je v ni jen jednou.
*/
class Set {
Bag b = new Bag();
void add(int e) {
throw new UnsupportedOperationException("naimplementujte!");
}
boolean contains(int e) {
throw new UnsupportedOperationException("naimplementujte!");
}
void remove(int e) {
b.remove(e);
}
}
* Upravte třídu ''RedBlueSet''. Zredukujte duplikaci kódu, zachovejte funkčnost třídy.
class RedBlueSet {
int[] redContents;
int redCount;
int[] blueContents;
int blueCount;
void addRed(int c) {
redContents[redCount++] = c;
}
int indexOfRed(int c) {
for (int i = 0; i < redCount; i++)
if (redContents[i] == c) return i;
return -1;
}
boolean containsRed(int c) {
return indexOfRed(c) != -1;
}
void removeRed(int c) {
int i = indexOfRed(c);
if (i == -1) return;
redContents[i] = redContents[--redCount];
}
void addBlue(int c) {
if (containsBlue(c)) return;
blueContents[blueCount++] = c;
}
int indexOfBlue(int c) {
for (int i = 0; i < blueCount; i++)
if (blueContents[i] == c) return i;
return -1;
}
boolean containsBlue(int c) {
return indexOfBlue(c) != -1;
}
void removeBlue(int c) {
int i = indexOfBlue(c);
if (i == -1) return;
blueContents[i] = blueContents[--blueCount];
}
}
===== 2. úloha na cvičení - Proxy a Adapter =====
* Implementujte třídu **''StackImpl''**.
class StackImpl {
int[] contents = new int[10000];
int size = 0;
StackImpl() {
System.out.println("Stack instanciovan");
}
public void push(int i) {
throw new UnsupportedOperationException("naimplementujte!");
}
public int pop() {
throw new UnsupportedOperationException("naimplementujte!");
}
public boolean isEmpty() {
throw new UnsupportedOperationException("naimplementujte!");
}
}
* V metodě ''main'' vytvářejte místo zásobníku **proxy**, které opravdové zásobníky vytvářejí až při prvním použití \\ {{:courses:a7b36omo:labs:proxy.jpg?700|}}
public static void main(String [] args){
StackImpl[] stacks = new StackImpl[100];
for (int i = 0; i < 100; i++) stacks[i] = new StackImpl();
}
* Vytvořte **adaptér**, který adaptuje ''StackImpl'' na ''WeirdStack'' \\ {{:courses:a7b36omo:labs:adapter.jpg?700|}}
interface WeirdStack {
//vlozi na vrchol zasobniku i
public void push(int i);
//vlozi postupne na vrchol zasobniku vsechny prvky is
public void push(int[] is);
//vrati hodnotu na vrcholu zasobniku (neodstranuje ji)
public int top();
//vrati hodnotu na vrcholu zasobniku (odstrani ji)
public int pop();
//projde zasobnik od vrcholu a vrati prvni zaporny prvek (ten je ze zasobniku odstranen)
public int popFirstNegativeElement();
//testuje, zda je zasobnik prazdny
public boolean isEmpty();
}