Zdrojak10

package sk.upjs.paz.prednaska10;

public class PrintedBook extends Book {

        // instancna premenna ... okrem nej ju definuju premenne z rodicovskej triedy
        private int shelfNumber;

        // GETTER
        public int getShelfNumber() {
                return shelfNumber;
        }

        // SETTER
        public void setShelfNumber(int shelfNumber) {
                this.shelfNumber = shelfNumber;
        }

        // Prekrytie rodicovskej implementacie
        @Override
        public String getLocation() {
                return "Shelf #" + shelfNumber;
        }

        @Override
        public String toString() {
                // volanie metody getLocation a rodicovskej implementacie toString
                return "Printed book " + getLocation() + "\n ---" + super.toString();
        }



}
 
package sk.upjs.paz.prednaska10;

// Ilustracia ako funguju konstruktory
public class EBook extends Book {

        private String link;

        // new EBook() -- Book() -- Object()

        // tento konstruktor by sa doplnil automaticky ak by sme iny nemali
        // v triede Book musi existovat bezparametricky konstruktor - inak je potrebne
        // pouzit iny
        public EBook() {
                // superclass je trieda ktoru rozsirujeme
                super();
        }

        // Ebook(5) -- Book(5)

        public EBook(String title, String[] authors, int publicationYear, String[] genres, double rating) {
                // volanie rodicovskeho konstruktora
                super(title, authors, publicationYear, genres, rating);
        }

        public EBook(String title, String link) {
                // rodicovsky konstruktor
                super(title);
                // dalsie naplnenie premennej
                this.link = link;
        }

        public String getLink() {
                return link;
        }

        public void setLink(String link) {
                this.link = link;
        }

        // anotaciu override nemusime pisat, ale odporuca sa to
        public String getLocation() {
                return link;
        }

}
 
package sk.upjs.paz.prednaska10;

import java.io.File;

public class AudioBook extends Book {

        // vygenerovane konstruktory Source->Generate Constructors from Superclass

        public AudioBook(String title, String[] authors, int publicationYear, String[] genres, double rating) {
                super(title, authors, publicationYear, genres, rating);
                // TODO Auto-generated constructor stub
        }

        public AudioBook(String title) {
                super(title);
                // TODO Auto-generated constructor stub
        }

        public AudioBook() {
                super("N/A");
        }

        private File folder;

        public File getFolder() {
                return folder;
        }

        public void setFolder(File folder) {
                this.folder = folder;
        }

        @Override
        public String getLocation() {
                // return folder + "";
                return folder.getName();
        }

}
 
package sk.upjs.paz.prednaska10;

// trieda z minuleho tyzdna - zmeny len v metode printAllBooks
public class Library {

        private Book[] books;

        public Library() {
                books = new Book[0];
        }

        public void addBook(Book book) {
                Book[] novePole = new Book[books.length + 1];
                System.arraycopy(books, 0, novePole, 0, books.length);
                novePole[novePole.length - 1] = book;
                books = novePole;
        }

        public void printAllBooks() {
                System.out.println("Kniznica ma tolko knih: " + books.length);
                for (int i = 0; i < books.length; i++) {
                        System.out.println(books[i].toString());

                        // mozne overenie ci ide o instanciu konkretnej triedy + pretypovanie
                        /*if (books[i] instanceof PrintedBook) {
                                PrintedBook kniha = (PrintedBook) books[i];
                                System.out.println(kniha.getLocation());
                                // Book books[i] ... PrintedBook kniha - maju rovnaku referenciu

                        }*/


                        // volanie metody je mozne lebo sa nachadza v triede Book
                        // polymorfizmus sposobi, ze sa vola implementacia v triede PrintedBook/AudioBook/EBook
                        System.out.println(books[i].getLocation());
                }
        }

        public void deleteBook(Book book) {
                int index = -1;
                for (int i = 0; i < books.length; i++) {
                        if (books[i] == book) {
                                index = i;
                                break;
                        }
                }
                if (index != -1) {
                        Book[] novePole = new Book[books.length - 1];
                        System.arraycopy(books, 0, novePole, 0, index);
                        System.arraycopy(books, index + 1, novePole, index, novePole.length - index);
                        books = novePole;
                }
        }

        public void deleteBook(String title) {
                int index = -1;
                for (int i = 0; i < books.length; i++) {
                        if (books[i].getTitle().equals(title)) {
                                index = i;
                                break;
                        }
                }
                if (index != -1) {
                        Book[] novePole = new Book[books.length - 1];
                        System.arraycopy(books, 0, novePole, 0, index);
                        System.arraycopy(books, index + 1, novePole, index, novePole.length - index);
                        books = novePole;
                }
        }

        public void printByGenre(String genre) {
                for (int i = 0; i < books.length; i++) {
                        if (books[i].hasGenre(genre)) {
                                System.out.println(books[i]);
                        }
                }
        }

}
package sk.upjs.paz.prednaska10;

import sk.upjs.jpaz2.*;

public class Launcher {

        public static void main(String[] args) {
                Book a = new PrintedBook();

                Book b = new Book();
                Object c = new Book();
                // ...
                Object d = new StringBuilder();

                // put your code here

                PrintedBook malyPrinc = new PrintedBook();
                // malyPrinc.title = "Maly Princ";
                // malyPrinc.publicationYear = 1943;
                malyPrinc.setTitle("Maly Princ");
                malyPrinc.setPublicationYear(1943);
                malyPrinc.setRating(9.7);
                String[] authorsMalyPrinc = { "Exupery" };
                malyPrinc.setAuthors(authorsMalyPrinc);
                malyPrinc.setGenres(new String[] { "zaner1", "zaner2" });
                malyPrinc.setShelfNumber(10);
                System.out.println(malyPrinc.getLocation());

                EBook hp1 = new EBook("Harry Potter 1", new String[] { "Rowling" }, 2000, new String[] { "zaner3", "zaner1" },
                                8.2);

                EBook hp2 = new EBook("Harry Potter 2", "https://hp.com");
                System.out.println(hp2.getLocation());

                Library kniznica = new Library();
                kniznica.addBook(malyPrinc);
                kniznica.addBook(hp1);
                kniznica.addBook(hp2);
                kniznica.printAllBooks();

                //String string = "abc";
                //PrintedBook s = (PrintedBook) string;

                // toString je zavolany automaticky
                System.out.println(hp2);
                // Object - ma toString
                // Book - ma toString
        }
}
package sk.upjs.paz.prednaska10;

import java.util.Arrays;

// Trieda z minuleho tyzdna - pribudla metoda getLocation
public class Book {

        /**
         * Nazov knihy.
         */

        private String title;

        /**
         * Zoznam autorov.
         */

        private String[] authors;

        /**
         * Rok vydania knihy.
         */

        private int publicationYear;

        /**
         * Zoznam zanrov.
         */

        private String[] genres;

        /**
         * Rating v rozsahu 0-10 (najlepsie hodnotenie je 10). Povolene su aj desatinne
         * cisla.
         */

        private double rating;

        public Book() {
        }

        public Book(String title, String[] authors, int publicationYear, String[] genres, double rating) {
                this.title = title;
                this.authors = authors;
                this.publicationYear = publicationYear;
                this.genres = genres;
                this.rating = rating;
        }

        public Book(String title) {
                this(title, null, 1900, null, 5.0);
        }

        // GETTRE A SETTRE

        public void setTitle(String newTitle) {
                title = newTitle;
        }

        public String getTitle() {
                return title;
        }

        public void setPublicationYear(int publicationYear) {
                this.publicationYear = publicationYear;
        }

        public String[] getAuthors() {
                return authors.clone();
        }

        public void setAuthors(String[] authors) {
                this.authors = authors;
        }

        public String[] getGenres() {
                return genres.clone();
        }

        public void setGenres(String[] genres) {
                this.genres = genres;
        }

        public double getRating() {
                return rating;
        }

        // v set metode mozeme vyriesit nepovolene hodnoty
        public void setRating(double rating) {
                if (rating < 0) {
                        this.rating = 0;
                        return;
                }
                if (rating > 10) {
                        this.rating = 10;
                        return;
                }
                this.rating = rating;
        }

        public int getPublicationYear() {
                return publicationYear;
        }

        // metoda toString bola vygenerovana v eclipse Source->Generate toString
        public String toString() {
                return "Book [title=" + title + ", authors=" + Arrays.toString(authors) + ", publicationYear=" + publicationYear
                                + ", genres=" + Arrays.toString(genres) + ", rating=" + rating + "]";
        }

        /*
         * public String toString() { return "kniha s nazvom " + title; }
         */


        // metoda ktora prehlada pole zanrov a overi ci sa tam zadany zaner nachadza
        public boolean hasGenre(String genre) {
                for (int i = 0; i < genres.length; i++) {
                        if (genre.equals(genres[i])) {
                                return true;
                        }
                }
                return false;
        }

        public String getLocation() {
                return "???";
        }

}
package sk.upjs.paz.prednaska10;

import sk.upjs.jpaz2.ObjectInspector;
import sk.upjs.jpaz2.Turtle;
import sk.upjs.jpaz2.WinPane;

public class TurtleExperiment {

        public static void main(String[] args) {
                WinPane w = new WinPane();
                // premenna uchovava referenciu na objekt triedy Turtle alebo triedy ktore ju rozsiruju
                Turtle t = new SmartTurtle();
                w.add(t);

                // polymorfizmus nezavisly od typu premennej - vykona sa implementacia zo SmartTurtle
                t.step(100);
                // Object inspector - ukazuje toString a dedicnost
                ObjectInspector oi = new ObjectInspector();
                oi.inspect(t);
        }

        // Object -- nema step
        // Turtle -- ma step ... [step, double]
        // SmartTurtle -- ma step... [step, double]
}
 
package sk.upjs.paz.prednaska10;

import sk.upjs.jpaz2.Turtle;

public class SmartTurtle extends Turtle {

        public void step(double length) {
                //this.step(length); -- takyto kod by volal tu istu metodu (sam seba)
                // volanie implementacie metody v rodicovskej triede Turtle
                super.step(length);
                System.out.println("posuvam sa o " + length);
        }

        // override je anotacia - informacia pre kompilator
        // vygenerovany kod - vola rodicovsku implementaciu
        @Override
        public void turn(double angle) {
                // TODO Auto-generated method stub
                super.turn(angle);
        }

        @Override
        public String toString() {
                        return "cool korytnacka na pozicii " + getX() + " " + getY();

        }

}