Druhý domácí úkol

Tento domácí úkol ukazuje rozdíl mezi tzv. mělkou kopií (shallow copy) a hlubokou kopií (deep copy) https://en.wikipedia.org/wiki/Object_copying

Interface OMOSetView definuje rozhraní umožňující přístup k prvkům množiny celých čísel. Abstraktní třída OMOSetBase definuje možnost přidávání a odebírání prvků.

interface OMOSetView {
   boolean contains(int element); // testuje na přítomnost prvku v množině
 
   int[] toArray(); //vrátí kopii prvků množiny v poli (na pořadí prvků nezáleží)
 
   OMOSetView copy(); //vrátí kopii množiny
}
 
abstract class OMOSetBase implements OMOSetView {
    public abstract void add(int element); //přidá prvek "element" do množiny
    public abstract void remove(int element); //odebere prvek "element" z množiny
}

Výše uvedené rozhraní a abstraktní třídu neodevzdávejte, hodnotící systém je již obsahuje.

Všechny vaše třídy se musí nacházet v package cz.cvut.k36.omo.hw.hw02.

Množina vrácená metodou copy() volané na instanci “a” nebude v případě následné změny (přidání/odebrání prvků) “a” změněna.

Dopište kód následujících tříd:

// třída reprezentující obecnou množinu
public class OMOSet extends OMOSetBase implements OMOSetView {
 
// metody rozhraní OMOSetView a OMOSetBase
}
 
// třída reprezentující sjednocení dvou množin: A sjednoceno B
public class OMOSetUnion implements OMOSetView {
 
   OMOSetUnion(OMOSetView setA, OMOSetView setB) {
   //...
   }
 
// metody rozhraní OMOSetView
}
 
// třída reprezentující průnik dvou množin: A průnik B
public class OMOSetIntersection implements OMOSetView {
 
   OMOSetIntersection(OMOSetView setA, OMOSetView setB) {
   //...
   }
 
// metody rozhraní OMOSetView
}
 
// třída reprezentující A\B: doplněk množiny B vzhledem k množině A:  A\B = { x | x?A ? x?B }
 
public class OMOSetComplement implements OMOSetView {
 
   OMOSetComplement(OMOSetView setA, OMOSetView setB) {
   //...
   }
 
// metody rozhraní OMOSetView
}
 
// třída reprezentující množinu sudých čísel 
public class OMOSetEven implements OMOSetView {
 
    OMOSetEven(OMOSetView setA) {
    //...
 
    }
// metody rozhraní OMOSetView
}

Instance tříd OMOSetUnion, OMOSetIntersection , OMOSetComplement a OMOSetEven si udržují pouze reference na instance dílčích tříd A a B (tj. neukládají si kopie jejich prvků). Pokud tedy vytvoříme například sjednocení dvou množin A a B a následovně odeberem prvek z množiny A, projeví se to i na výsledku sjednocení.

Odevzdávaný kód (tzn. třídy OMOSet, OMOSetUnion, OMOSetIntersection, OMOSetComplement a OMOSetEven - každou v samostatném .java souboru) zabalte do .zip archivu a odevzdejte do systému Brute. Celý projekt také uložte do svého gitlab repozitáře.

Projekt si muzete stahnou zde: du2.zip