Kopiuj
interface Silnik {
void start();
}
class ZejebistySilnik implements Silnik {
public void start() {
System.out.println("Wwwrrr wrrrrr!");
System.out.println("Wwwwwwwwiuuuuuuuuuuąąąąą!");
}
}
class StarySilnik implements Silnik {
public void start() {
wlaczSsanie();
try {
Thread.sleep(1000);
} catch (InterruptedException exc) {
}
System.out.println("Pyr pyr pyr.");
}
private void wlaczSSanie() {
System.out.println("Ślup ślup ślup...");
}
}
interface Samochod {
void jedz();
}
abstract class AbstractSamochod implements Samochod {
private Silnik silnik;
public AbstractSamochod(Silnik silnik) {
this.silnik = silnik;
public void jedz() {
silnik.start();
}
}
}
class BMWz8 extends AbstractSamochod {
public BMWz8(Silnik silnik) {
super(silnik);
}
}
class Maluch extends AbstractSamochod {
public Maluch(Silnik silnik) {
super(silnik);
}
}
public class Main {
public static final main(String[] args) {
Samochod s = new BMWz8(new ZajebistySilnik());
s.jedz();
s = new Maluch(new StarySilnik());
s.jedz();
s = new Maluch(new ZajebistySilnik());
s.jedz();
}
Powyzej masz kompozycje (has-a), oraz dziedziczenie (is-a), pokazany polimorfizm (s.jedz()), kodowanie do interfejsow i cholera wie co jeszcze.
Is-a: i BMW i Maluch sa samochodami, wiec oba mozna przypisac do referencji Samochod, i na obu mozna wykonwac metode jedz() zdefiniowana w interfejsie Samochod.
Is-a: ZajebistySilnik i StarySilnik sa Silnikami, oba mozna przypisac do referencji na Silnik i na obu mozna wywolac metode start(). Dzieki temu mogles utrozyc malucha z zajebistym silnikiem, oraz mozesz utworzyc BMW ze starym silnikiem (zauwaz ze uzywam w konstruktorze Silnik, czyli klase / interfejs bazowy.
Has-a: wszystkie samochody maja jakiestam silniki (chyba), wiec aby Samochod mogl pojechac musisz mu zapodac silnik ktorego bedzie uzywac.
Kodowanie do interfejsow: pozwala na tworzenie roznych wariantow obiektow, jak np super-maluch lub kijowy bmw (mozesz podmieniac silniki).
Polimorfizm - majac referencje na samochod, mozesz przypisac do niej jakikolwiek samochod (wazne aby byl implementowany konkretny interfejs). Jak wywolasz na takiej referencji metode jedz() to automatycznie bedzie wolana metoda odpowiedniej podklasy. W przypadku silnika widac to tutajnajlepiej: masz referencje na silnik, i dla BMW z super silnikiem otrzymasz tylko 2 linijki tekstu, natomiast dla jakiegokolwiek samochodu ze starym silnikiem otrzymasz linijke ze musi zassac, odczeka minute i dopiero popyrka z miejsca. I wszystko automatycznie.
Masz to dosc informacji na nastepny tydzien pewnie, powodzenia.
Disclaimer: kod pisalem bez IDE z biegu, wiec moze miec bledy jesli bedziesz chcial(a) przekleic.