Cvičenie č. 4 - OOP druhýkrát - modifikátory, generické programovanie

Opakovanie terminológie

  • trieda vs objekt vs inštancia
  • konštruktor
  • virtuálna metóda
    • modifikátory virtual a override
    • interface
  • daľšie modifikátory:
    • public
    • private
    • protected
    • static

Úloha č. 1: Nájdi chybu

Dedičnosť a virtuálne metódy

class Fruit {
  public virtual String getTaste() { return "salty"; }
}

class Apple : Fruit {
  public override String getTaste() { return "sweet"; }

  public String getColor() { return "red"; }
}

class Lemon : Fruit {
  public String getColor() { return "yellow"; }
}

static void Main(string[] args) {
  Apple apple = new Apple(); // OK

  // OK: priradzovat specificku instanciu do predka vo forme
  // triedy/interfacu je ok.
  Fruit fruit = new Apple();

  Lemon lemon = new Lemon(); // OK
  Fruit fruit2 = new Lemon(); // OK

  // Chyba: Aj ked Lemon a Apple maju spolocneho predka,
  // tak su to 2 rozne typy.
  Lemon fruit3 = new Apple();

  // Chyba: staticke volanie nestatickej metody.
  Console.WriteLine(Apple.getTaste());

  Console.WriteLine(apple.getTaste()); // OK: vypise "sweet"
  Console.WriteLine(fruit.getTaste()); // OK: vypise "sweet"
  Console.WriteLine(lemon.getTaste()); // OK: vypise "salty"
  Console.WriteLine(fruit2.getTaste()); // OK: vypise "salty"

  // Chyba: Typ Fruit nema zadefinovanu metodu getColor.
  Console.WriteLine(fruit.getColor());

  Console.WriteLine(lemon.getColor()); // OK: vypise "yellow"
}

Modifikátory prístupu

class Fruit {
  private String taste = "salty";
  protected String color = "blue";
  public int weight = 1;

  public String getTaste() { return taste; }
}

class Apple : Fruit {
  // Chyba: atribut taste je private, tzn. nie je mozne donho pristupovat
  // v ramci triedy Apple. Aby toto fungovalo musite upravit modifikator
  // na protected.
  public Apple(String taste) { this.taste = taste; }
}

static void Main(string[] args) {
  Apple apple = new Apple("sweet"); // OK
  apple.taste = "bitter"; // Chyba: atribut je private
  apple.color = "red"; // Chyba: atribut je protected
  apple.weight = 10; // OK: atribut je public
}

Modifikátor static 1.

class Fruit {
    public String taste = "salty";
    public static String color = "blue";

    public String getTaste() {
        return taste; // OK
    }

    public String getColor() {
        // OK: Z nestatickej metody mozete pristupovat k statickemu atributu.
        return color;
    }
}

static void Main(string[] args)
{
    Fruit fruit = new Fruit(); // OK
    fruit.taste = "bitter"; // OK
    fruit.color = "red"; // Chyba: nestaticky pristup k statickemu atributu.

    Fruit.taste = "sour"; // Chyba: staticky pristup k nestatickemu atributu.
    Fruit.color = "green"; // OK
}

Modifikátor static 2.

static class Fruit {
  // Chyba: Staticka trieda moze obsahovat len statickych clenov.
  public String taste = "salty";

  public static String color = "blue"; // OK

  // Chyba: Staticka trieda moze obsahovat len statickych clenov.
  public String getTaste() {
    return taste;
  }

  // Chyba: Staticka trieda moze obsahovat len statickych clenov.
  public String getColor() {
    return color;
  }
}

static void Main(string[] args) {
  // Chyba: Staticka trieda sa neda instanciovat.
  Fruit fruit = new Fruit();
}

Úloha č. 2: Generické rozšírenie listu

Rozšírte vašu implementáciu listu tak, aby ste doňho mohli dávať objekty ľubovoľného typu.

Domáca úloha č 1. (povinná): Kontrola zaměstnanců

Vašu povinnú domácu úlohu tentokrát nájdete v CodEx-e.

Poznámky:

  • Vaše riešene musí používať nejakú vami napísanú dynamickú dátovú štruktúru
    • list z prvej domácej úlohy je OK
    • dátové štruktúry poskytované C#-pom sú zakázané
    • použitie staticky alokovaného pola s nejakou veľkou dĺžkou je zakázané tiež
  • Vyhľadávanie prvku v čase O(N) je OK

Termín odovzdania: 19. 3. 2017(23:59)

Spôsob odovzdania: CodEx (odovzdávajte hlavný zdroják obsahujúci metódu main)

Počet bodov: 20

Domáca úloha č 2. (bonusová): Efektívna implementácia print-u

Niekoľko z vás si všimlo, že so zadefinovaným interface-om pre náš list nie je možné naimplementovať abstraktný print, ktorý by používal ArrayList aj LinkedList bez toho, aby print LinkedList-u nebol v čase O(n^2). Vašou úlohou je navrhnúť novú abstrakciu (nové metódy, triedy alebo interface-y), ktoré vám umožnia naimplementovať abstraktný print v čase O(n) pre ArrayList aj LinkedList.

Hint: Vytvorte si nový interface Iterator, s metódami:

  • next() - vráť mi ďalší prvok
  • hasNext() - vráti True ak ešte nasleduje ďalši prvok, inak False

Potom pre LinkedList aj ArrayList naimplementujte vlastný iterátor a tento iterátor si vráťte novou metódou listu getIterator.

Termín odovzdania: 19. 3. 2017(23:59)

Spôsob odovzdania: zdrojový kód mailom

Počet bodov: 20