3. seminář - Rozhraní

TEACHINGJJ1

Polymorfismus

  • Na objekt lze nahlížet z více úhlů pohledu - může být instancí více různých tříd a rozhraní (s omezeními, viz dále). Např. jeden člověk může být úředník, manžel i skaut - a dle aktuální situace tedy mít různé vlastnosti a možnosti.
  • Více tříd může mít stejné metody. Např. metodu toString() mají všechny objekty (všechny instance všech tříd).
  • Metoda jednoho názvu může mít více verzí s různými seznamy argumentů (už jste viděli).

Rozhraní (interface)

  • Umožňuje vynutit, aby nějaké třídy implementovaly nějaké metody (kontrakt). Typicky nějaká abstraktní vlasnost, kterou mohou mít různé spolu vůbec nesouvisející třídy.
  • Příklad rozhraní Comparable zajišťuje, že třída implementuje vše potřebné k porovnávání jejich instancí.
  • Typicky nejsme schopni říct, jak to jednotlivé konkrétní třídy budou dělat. Tedy konkrétní implementace těchto metod může být úplně odlišná pro různé třídy.
  • Interface v Javě nemůže obsahovat žádné atributy kromě konstant. Veřejné třídní (static) metody mohou mít implementaci, veřejné instančí metody také, ale musí být označeny klíčovým slovem default. Soukromé metody mohou mít implementaci.
  • Každá třída může implementovat více rozhraní. Klíčové slovo implements.
  • Rozhraní nemůže být final, ale podobně jako sealed třídy existují od Java 17 i sealed rozhraní.
  • Instance rozhraní je každá instance každé třídy, která toto rozhraní implementuje.

Deklarace rozhraní


    interface AreaAndCircuitComputable {
        public double getArea();
        public double getCircuit();
    }

Implementace rozhraní


    class Square implements AreaAndCircuitComputable {
        
        double side;
        
        Square(double side) {
            this.side = side;
        } 
      
        public double getArea() {
            return side * side;
        }
        
        public double getCircuit() {
            return 4 * side;
        }
    }
    
    class Circle implements AreaAndCircuitComputable {
        
        Point center;
        
        double radius;
        
        Square(Point center, double Radius) {
            this.side = side;
        } 
      
        public double getArea() {
            return side * side;
        }
        
        public double getCircuit() {
            return 4 * side;
        }
    }
    
    class Main {
        public static void main(String[] args) {
            AreaAndCircuitComputable[] shapes = {
                new Square(10),
                new Square(20),
                new Circle(new Point(1, 2), 30),
                new Circle(new Point(10, 33), 22.2)
            };

            double totalArea = 0;

            for (AreaAndCircuitComputable shape : shapes) {
                totalArea += shape.getArea();
            }

            System.out.println("Total Area is: " + totalArea);
        }
    }

Úkoly

Navrhněte vhodné třídý a rozhraní tak, aby jednotlivých tříd bylo možné stejným způsobem získat informaci pro následující UI komponenty:

předměty a přestávka, zkoušky

Pro výpočet časového untervalu můžete použít následující kód:


    LocalDateTime begin = LocalDateTime.of(2022, 10,6, 9, 38);
    LocalDateTime end = LocalDateTime.now();
    
    // Casovy interval
    Duration duration = Duration.between(begin, end);
    
    // Casovy interval v hodinach
    System.out.print(duration.toHours() + " h,");
    // Casovy interval v minutach
    System.out.print(duration.toMinutes() + " min,");