# Inheritance
Mechanizm pozwalający na wpółdzielenie funcjonalności między
Klasy bazowe (superclass) oraz klasy pochodne (subclass)
Każda klasa może rozszerzać inną klase (w javie 11, w najnowszych wersjach javy dodano sealed classes), ale tylko jedną.
// zagadać o to jakie realne przykłady, co kojarzą z poprzednich projektów
Przykład z klasą Vehicle i Car
```java=
public class Vehicle {
private int wheelsNumber;
public Vehicle(int wheelsNumber) {
this.wheelsNumber = wheelsNumber;
}
public void goForward() {
System.out.println("Going forward");
}
}
public class Bicycle extends Vehicle {
public Bicycle() {
super(2);
}
@Override
public void goForward() {
System.out.println("Pedal the bicycle");
super.goForward();
}
}
public class Car extends Vehicle {
private int fuelLiters;
public Car(int fuelLiters) {
super(4);
this.fuelLiters = fuelLiters;
}
public void start() {
System.out.println("Turning car ignition");
if (fuelLiters == 0) {
throw new IllegalStateException("No fuel to start car");
}
System.out.println("Started car");
}
@Override
public void goForward() {
System.out.println("Press gas pedal");
super.goForward();
}
}
public class Main {
public static void main(String[] args) {
Vehicle vehicle = new Vehicle(3);
vehicle.goForward();
Car car = new Car(2);
car.start();
car.goForward();
}
}
```
- [ ] konstruktory bezargumentowe i argumentowe
- [ ] super
- [ ] override metody
- [ ] dziedziczenie z object
- [ ] `toString` `hashcode`
Zadanie kodowania - Geometry Klasa shape, circle, rectangle, square metoda Area
Zaprezentować diamond problem czyli czemu można rozszerzać tylko jedną klasę
# Polymorphism, encapsulation (polimorfizm i hermetyzacja/enkapsulacja)
Polimorfizm jest to zdolność obiektu do przybierania wielu form. Pozwala na wykoanie tych samych akcji na różne sposoby bez wiedzy o ich implementacji
- [ ] zaprojektowanie biblioteki
Klasa `Library` `Book` -> `HardCoverBook`, `SoftCoverBook` (hardcover ma np Bookmark ze zaznaczoną jakąś stroną)
```java=
public class Library {
private Book[] shelf;
private int index = -1;
public Library(int size) {
shelf = new Book[size];
}
public void addBook(Book book) {
index++;
shelf[index] = book;
}
public Book getBook(int index) {
if (index >= 0 && index <= this.index) {
return shelf[index];
}
throw new IllegalArgumentException("There is no book on shelf in position: " + index);
}
}
```
- [ ] w mainie wywołanie addBook, getBook i castowanie (instanceof)
- [ ] task wymyslcie sami jakis przykład ze mamy jakas wpólną funkcje i te klasy nadpisują i jakies wykorzystanie tego typu nadrzednego
## Dodatkowo warto omówić przed uml
- [ ] enum
- [ ] pakietowanie - idea i jak
- [ ] List - ArrayList i LinkedList