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
virtualaoverride interface
- modifikátory
- daľšie modifikátory:
publicprivateprotectedstatic
Ú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
Trueak ešte nasleduje ďalši prvok, inakFalse
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