Black Friday Black Friday
Black Friday výprodej! Až 80 % extra bodů zdarma! Více informací zde

Cvičení k 17.-19. lekci OOP v Javě

Java Objektově orientované programování Cvičení k 17.-19. lekci OOP v Javě

Unicorn College ONEbit hosting Tento obsah je dostupný zdarma v rámci projektu IT lidem. Vydávání, hosting a aktualizace umožňují jeho sponzoři.

Následující 3 cvičení vám pomohou procvičit znalosti programování v Javě z minulých lekcí. Ve vlastním zájmu se je pokuste vyřešit sami. Pod článkem máte pro kontrolu řešení ke stažení. Ale pozor, jakmile se na něj podíváte bez vyřešení příkladů, ztrácí pro vás cvičení smysl a nic se nenaučíte :)

Pokud si opravdu nebudete vědět rady, podívejte se raději znovu do minulých tutoriálů a pokuste se na to přijít.

Jednoduchý příklad

Představte si, že programujete internetový obchod. Vytvořte aplikaci, ve které budou figurovat:

  • zákazníci
  • adresy
  • produkty
  • objednávky

Jednotlivým třídám vymyslete vlastnosti, vytvořte konstruktory a přepište metodu toString(). Objednávka bude mít referenci na produkt (stačí na jeden) a zákazníka. Zákazník bude mít referenci na fakturační a dodací adresu.

Snad do každého internetového obchodu potřebujeme zaintegrovat platební bránu. Takovou platební bránu nám poskytne nějaká externí společnost, určitě si ji nevyrobíme doma na koleni. Od jejího poskytovatele jsme tedy získali rozhraní, které musí implementovat třída Objednavka v našem obchodu, aby ji bylo možné bránou zaplatit. Rozhraní je následující:

import java.util.ArrayList;

/**
 * Rozhraní, které jsme dostali od vývojářů platební brány.
 * Implement this interface to use our payment gateway
 */
public interface OrderInterface {

    int getNumber();

    /**
     * Customer's first name
     */
    String getFirstName();

    /**
     * Customer's last name
     */
    String getLastName();

    /**
     * Street
     */
    String getStreet();

    /**
     * House number
     */
    int getHouseNumber();

    /**
     * Registry number
     */
    int getRegistryNumber();

    /**
     * City
     */
    String getCity();

    /**
     * Zip code
     */
    String getZipCode();

    /**
     * Country
     */
    String getCountry();

    /**
     * Product names
     */
    ArrayList<String> getProducts();

    /**
     * Product quantities
     */
    ArrayList<Integer> getProductQuantities();

    /**
     * Product prices
     */
    ArrayList<Double> getProductPrices();

}

Vlastnosti jsou:

  • číslo objednávky
  • jméno zákazníka
  • příjmení zákazníka
  • ulice z fakturační adresy zákazníka
  • číslo popisné
  • číslo orientační
  • město
  • PSČ
  • stát
  • pole názvů objednaných produktů
  • pole počtů objednaných produktů
  • pole cen objednaných produktů

Implementujte toto rozhraní ve své třídě Objednavka. Následně vytvořte instanci adresy, zákazníka a testovací objednávky s následujícími daty:

Položka "Body pro ITnetwork.cz" s popisem "Body pro zpřístupnění prémiového obsahu a dosažení vašeho vysněného zaměstnání v IT." s cenou 239 Kč na osobu "Tomáš" "Marný", "Ve Svahu" "10"/"2", "Praha" "10000", "Česká republika".

Přidejte do aplikace třídu Gateway, která zastupuje platební bránu od nějaké firmy. Kód má následující:

/**
 * Tato třída reprezentuje platební bránu nějakého většího systému třetí strany. V reálu by zde tedy bylo
 * ještě spoustu dalších tříd a metod.
 */
public class Gateway {

    /**
     * Metoda simuluje zpracování objednávky, zde pouze vypsáním do konzole. Důležité je, že díky dodržení
     * rozhraní od vývojářů platební brány umí brána pracovat s naší objednávkou, i když naši třídu nikdy
     * neviděli.
     * @param order Objednávka implementující rozhraní OrderInterface
     */
    public void processOrder(OrderInterface order) {
        System.out.println("Order no. " + order.getNumber());
        System.out.println("=============");
        System.out.println("Name:    " + order.getFirstName() + " " + order.getLastName());
        System.out.println("Address: " + order.getStreet() + " "
                + order.getHouseNumber() + "/" + order.getRegistryNumber());
        System.out.println("         " + order.getCity() + " " + order.getZipCode());
        System.out.println("         " + order.getCountry());
        System.out.println();

        int sum = 0;
        for (int i = 0; i < order.getProducts().size(); i++) {
            System.out.println(order.getProducts().get(i) + " " +  order.getProductQuantities().get(i)
                    + "pcs per " + order.getProductPrices().get(i) + ",-");
            sum += order.getProductPrices().get(i);
        }
        System.out.println();
        System.out.println("Total price: " + sum + ",-");
    }

}

Pokud jste implementovali správně rozhraní, půjde přes tuto třídu vytisknout vaše objednávka, i když autor třídy vaši třídu Objednavka nikdy neviděl. Máme zde krásnou praktickou ukázku užitečnosti rozhraní :)

Zde je možný kód pro vytvoření objednávky a předání objednávky bráně.

Zakaznik zakaznik = new Zakaznik(1, "Tomáš", "Marný");
Adresa adresa = new Adresa("Ve Svahu", 10, 2, "Praha", "10000");
Produkt produkt = new Produkt("Body pro ITnetwork.cz", "Body pro zpřístupnění prémiového obsahu a dosažení vašeho vysněného zaměstnání v IT.", 239);
Objednavka objednavka = new Objednavka(1, produkt, zakaznik, adresa, adresa);
// Vytvoření brány a předání objednávky bráně
Gateway brana = new Gateway();
brana.ProcessOrder(objednavka);

Ukázka obrazovky programu:

Konzolová aplikace
Order no. 1
=============
Name:    Tomáš Marný
Address: Ve Svahu 10/2
         Praha 10000
         Česká republika

Body pro ITnetwork.cz 1pcs per 239.0,-

Total price: 239,-

    public class Adresa
    {
    }
/**
 * Tato třída reprezentuje platební bránu nějakého většího systému třetí strany. V reálu by zde tedy bylo
 * ještě spoustu dalších tříd a metod.
 */
public class Gateway {

    /**
     * Metoda simuluje zpracování objednávky, zde pouze vypsáním do konzole. Důležité je, že díky dodržení
     * rozhraní od vývojářů platební brány umí brána pracovat s naší objednávkou, i když naši třídu nikdy
     * neviděli.
     * @param order Objednávka implementující rozhraní OrderInterface
     */
    public void processOrder(OrderInterface order) {
        System.out.println("Order no. " + order.getNumber());
        System.out.println("=============");
        System.out.println("Name:    " + order.getFirstName() + " " + order.getLastName());
        System.out.println("Address: " + order.getStreet() + " "
                + order.getHouseNumber() + "/" + order.getRegistryNumber());
        System.out.println("         " + order.getCity() + " " + order.getZipCode());
        System.out.println("         " + order.getCountry());
        System.out.println();

        int sum = 0;
        for (int i = 0; i < order.getProducts().size(); i++) {
            System.out.println(order.getProducts().get(i) + " " +  order.getProductQuantities().get(i)
                    + "pcs per " + order.getProductPrices().get(i) + ",-");
            sum += order.getProductPrices().get(i);
        }
        System.out.println();
        System.out.println("Total price: " + sum + ",-");
    }

}
package onlineapp;
import java.util.ArrayList;

/**
 * Rozhraní, které jsme dostali od vývojářů platební brány.
 * Implement this interface to use our payment gateway
 */
public interface OrderInterface {

    int getNumber();

    /**
     * Customer's first name
     */
    String getFirstName();

    /**
     * Customer's last name
     */
    String getLastName();

    /**
     * Street
     */
    String getStreet();

    /**
     * House number
     */
    int getHouseNumber();

    /**
     * Registry number
     */
    int getRegistryNumber();

    /**
     * City
     */
    String getCity();

    /**
     * Zip code
     */
    String getZipCode();

    /**
     * Country
     */
    String getCountry();

    /**
     * Product names
     */
    ArrayList<String> getProducts();

    /**
     * Product quantities
     */
    ArrayList<Integer> getProductQuantities();

    /**
     * Product prices
     */
    ArrayList<Double> getProductPrices();

}
    package onlineapp;
    import java.util.ArrayList;

    public class Objednavka implements OrderInterface
    {
    }
    public class Produkt
    {
    }
    public class Zakaznik
    {
    }

Středně pokročilý příklad

Vytvořte předka reprezentujícího obecný nástroj. Předek bude disponovat vlastnostmi vaha, nazev a abstraktní metodou pracuj(), která nebere žádný parametr a vrací String.

Z nástroje vytvořte potomky Pila, Sroubovak a Kladivo. Kladivo bude mít vlastnost typu boolean zda je obouruční. Nástroje budou implementovat metodu pracuj() tak, že kladivo vypíše do konzole "Zatloukám", šroubovák "Šroubuji" a podobně. Přidejte ještě potomka šroubováku ElektrickySroubovak, který má navíc kapacitu baterie, nastavitelnou v konstruktoru.

V druhé části úkolu vytvořte třídu Bedna, která bude sloužit k uchovávání nářadí. Její vlastností je maximální váha (nosnost, tedy kolik bedna unese) a poté váha nářadí, které je v ní vložené. Implementujte metody pro vložení nástroje do bedny a vyndání nástroje z bedny. Ošetřete, aby se nedal vložit nástroj tak, aby se překročila nosnost bedny. Zamyslete se nad zapouzdřením, kolekce s nářadím nesmí být veřejná, aby se nedal obejít limit nosnosti. Bedna nakonec implementujte metodu pro zjištění celkové hmotnosti obouručních kladiv v ní vložených.

Vaši práci demonstrujte na testovacích datech. Nakonec nechte všechny nástroje v bedně pracovat.

Do bedny s nosností 10000g postupně vložte tyto nástroje v daném pořadí: "Kladívko" (1200 g), "Velké kladivo" (3000 g), "Bourací kladivo" (4000 g), "Šroubovák Philips" (800g), "Zrezivělá pila" (2500 g), "Elektrický šroubovák Bosh" (1800 g). Poté vypište obsah bedny.

ArrayList není imutabilní kolekce, proto getter na bedně, který bude vracet všechny nástroje v ní, bude vypadat takto:

public List<Nastroj> getNastroje() {
    return Collections.unmodifiableList(nastroje);
}

Collections.unmodifiableList() vytvoří neměnitelnou kolekci z našeho listu nástrojů. Tak můžeme nástroje sice vrátit, ale nikdo nám je nemůže měnit jinak, než přes metody, které jsme v rozhraní naší třídy pro tyto účely připravili. Vidíme, že List je pouze interface a metoda tak může vrátit různé implementace listu.

Výstup by měl být, při správném ošetření maximální hmotnosti, následující:

Konzolová aplikace
Bedna je prázdná.
V bedně je: Kladívko, Velké kladivo, Bourací kladivo, Šroubovák Philips, Elektrický šroubovák, Zrezivělá pila
Zatloukám
Zatloukám
Zatloukám
Šroubuji
Šroubuji elektricky
Piluji
Váha obouručních kladiv je 7000 gramů

    package onlineapp;
    import java.util.ArrayList;
    import java.util.Collections;
    import java.util.List;

    public class Bedna
    {
    }

    public class ElektrickySroubovak extends Sroubovak
    {
    }
    public class Kladivo extends Nastroj
    {
    }
    public abstract class Nastroj
    {
    }
    public class Pila extends Nastroj
    {
    }
    public class Sroubovak extends Nastroj
    {
    }

Pokročilý příklad

Vytvořte aplikaci, ve které figurují třídy Clovek, který je abstraktním předkem pro třídy Muz a Zena. Člověk má vlastnosti jmeno, prijmeni a datumNarozeni a přetěžuje metodu compareTo() tak, aby byly jeho instance řazeny podle abecedy a ty se stejným jménem podle data narození.

Člověku také vytvořte metodu plus(Clovek other) tak, aby se sečtením dvou lidí opačného pohlaví získal nový člověk (dítě). Nový člověk bude buď Muz nebo Zena, to náhodně vylosujte s pravděpodobností 50:50. Noví muži dostanou jméno "Adam", ženy "Eva" a příjmení po otci, resp. matce. Při sečtení lidí stejného pohlaví získáme hodnotu null.

Vytvořte kolekci následujících lidí:

  • "Karel" "Novák", Narozen 5.2.1988
  • "Josef" "Nový", Narozen 19.3.1978
  • "Jan" "Marek", Narozen 28.4.1968
  • "Karel" "Novák", Narozen 25.6.1958
  • "Marie" "Nová", Narozena 15.8.1988
  • "Věra" "Nováková", Narozena 2.10.1978
  • "Simona" "Mladá", Narozena 8.1.1968
  • "Michaela" "Marná", Narozena 6.12.1958

Kolekci nechte seřadit a následně vytvořte dítě sečtením páru Karel Novák a Marie Nová.

Ukázka obrazovky programu (číslo za jménem je rok narození):

Konzolová aplikace
Jan Marek 68
Josef Nový 78
Karel Novák 58
Karel Novák 88
Marie Nová 88
Michaela Marná 58
Simona Mladá 68
Věra Nováková 78

Karel Novák 88 a Marie Nová 88 spolu mají dítě Eva Nová 17

package onlineapp;

import java.time.LocalDate;
import java.util.ArrayList;
import java.util.Collections;

    package onlineapp;

    import java.time.LocalDate;
    import java.util.Random;

    public abstract class Clovek implements Comparable<Clovek>
    {
    }
    package onlineapp;

    import java.time.LocalDate;

    public class Muz extends Clovek
    {
    }
    package onlineapp;

    import java.time.LocalDate;

    public class Zena extends Clovek
    {
    }

 

Stáhnout

Staženo 12x (84.21 kB)
Aplikace je včetně zdrojových kódů v jazyce java

 

 

Článek pro vás napsal Samuel Kodytek
Avatar
Jak se ti líbí článek?
Ještě nikdo nehodnotil, buď první!
Autor se věnuje všem jazykům okolo JVM. Rád pomáhá lidem, kteří se zajímají o programování. Věří, že všichni mají šanci se naučit programovat, jen je potřeba prorazit tu bariéru, který se říká lenost.
Aktivity (14)

 

 

Komentáře

Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zatím nikdo nevložil komentář - buď první!