/*
Objektovo-orientovane programovanie 2006/2007
Valentino Vranić
Skúška 23.5.2007

Toto je kód jedného z možných riešení pre otázku 18.

Každá trieda by mala byť v samostatnom súbore s názvom v tvare NázovTriedy.java. Pre úplnosť by na začiatku každého takého súboru mal byť uvedený balík do ktorého triedy patria:

	package mymodel;
*/

// prvky majú spoločné vlastnosti
// predovšetkým je to operácia spájania
public abstract class MyElement {
	 private int n = 0; // počet väzieb
	 private MyElement[] con; // pripojené prvky
	 private int value; // ohodnotenie prvku
	 
	 public MyElement(int value, int nmax) {
			this.value = value;
			con = new MyElement[nmax];	 
	 }
	 
	 public int getValue() { return value; }
	 public void setValue(int i) { value = i; }

	 public void spoj(MyElement e) throws ConnectionsExceededException {
			if (n < con.length) { // maximálny počet väzieb je daný veľkosťou reťazca
				 con[n] = e;
				 setValue(e.adaptValue(value));
				 n++;
			}
			else
				 throw new ConnectionsExceededException();
	 }

	 // metóda vypočíta ohodnotenie prvku po spojení s iným prvkom
	 // spôsob úpravy ohodnotenia závisí od druhu prvku
	 public abstract int adaptValue(int i);
}

public class Adder extends MyElement {
	 // implicitný konštruktor už nie je
	 public Adder(int value, int nmax) {
			super(value, nmax);
	 }
	 
	 // úprava ohodnotenia pri spojení s Adderom
	 public int adaptValue(int i) {
			return i + getValue();
	 }
}

public class Subtracter extends MyElement {
	 public Subtracter(int value, int nmax) {
			super(value, nmax);
	 }

	 // úprava ohodnotenia pri spojení so Subtracterom
	 public int adaptValue(int i) {
			return i - getValue();
	 }
}

public class Multiplier extends MyElement {
	 public Multiplier(int value, int nmax) {
			super(value, nmax);
	 }

	 // úprava ohodnotenia pri spojení s Multiplierom
	 public int adaptValue(int i) {
			return i * getValue();
	 }
}

public class ConnectionsExceededException extends Exception { }

public class M {
	 public static void main(String[] args) {
			Adder a = new Adder(1, 3);
			Subtracter s = new Subtracter(2, 5);
			Multiplier m = new Multiplier(3, 2);
			
			System.out.println("a: " + a.getValue() + "	s: " + s.getValue() + "	m: " + m.getValue());

			try {
				 a.spoj(s);
				 s.spoj(m);
				 m.spoj(a);
			} catch(ConnectionsExceededException e) {
				 System.out.println("Bol prekroceny pocet spojeni.");
			}
			
			System.out.println("a: " + a.getValue() + "	s: " + s.getValue() + "	m: " + m.getValue());
	 }
}
