Lekcja 1

Interfejsy, klasy abstrakcyjne

Interfejs (z ang. "międzymordzie") - byt programistyczny pozwalający na dużą elastyczność przy zachowaniu statycznego typowania.

I. Interfejsy



// Implementacja interfejsu
interface CosCoJedzie {
    void jedz();
}

class Auto implements CosCoJedzie {
    public void jedz() {
        System.out.println("Jadę");
    }
}

public class Main {
    public static void main(String[] args) {
        CosCoJedzie cosJezdzacego = new Auto();
        cosJezdzacego.jedz();
    }
}
                    

// Zależności pomiędzy klasami, interfejsami:

// Deklaracja interfejsu A
interface A {}

// B zawiera w sobie metody z A
interface B extends A {}

// C zawiera metody z A i B
interface C extends A, B {}

// D dziedziczy po Object
class D {}

// E dziedziczy po D
class E extends D {}
                
Klasa Interfejs
Posiada pola, metody Tylko metody, statyczno-finalne pola
Metody muszą zostać zaimplementowane (ciało metody) Nie mogą (prawie) mieć implementacji metod.
Może mieć konstrukor Nie może mieć konstruktora
Może dziedziczyć po jednej klasie (domyślnie po Object), może implementować wiele interfejsów (w tym żadnego). Może dziedziczyć po wielu interfejsach.
Jeśli implementuje interfejs, musi mieć wszystkie metody z tego interfejsu. Jeśli rozszerza interfejs, to nie wymaga uzupełnienia o metody bazowego interfejsu.
Zadanie 0

Utwórz interfejsy podane w tabeli. Następnie utwórz klasę, która zaimplemetuje co najmniej 2 interfejsy (koniecznie IsGame).

Nazwa interfejsu Metoda
IsGame void play();
IsStrategic void nextTurn();
IsRPG void takeQuest();
IsShooter void shoot();
Zadanie 1

Utwórz obiekt danego interfejsu bez tworzenia implementującej klasy, który zaimplementuje interfejs IsGame.


// Podpowiedź:
public class Main {
    public static void main(String[] args) {
        CosCoJedzie cosJezdzacego = new CosCoJedzie() {
            public void jedz() {
                System.out.println("Obiekt klasy anonimowej");
            }
        };
        cosJezdzacego.jedz();
    }
}
                            

II. Klasy abstrakcyjne



interface CosCoJedzie {
    void jedz();
}

abstract class Samochod implements CosCoJedzie {
    public void gazDoDechy() {
        System.out.println("Jadę szybko");
        jedz();
    }
    abstract String marka();
}

class KonkretnySamochod extends Samochod {

    public void jedz() {
        System.out.println("Jadę");
    }

    String marka() {
        return "Konkretny model";
    }
}

public class Main {
    public static void main(String[] args) {
        KonkretnySamochod ks = new KonkretnySamochod();
        System.out.println(ks.marka());
        ks.gazDoDechy();
    }
}
Klasa Klasa abstrakcyjna
Posiada pola, metody Posiada pola, metody
Można utworzyć jej obiekt (jeśli konstrukor nie jest prywatny) Nie można utworzyć obiektu.
Metody muszą mieć ciało. Metody nie muszą mieć ciała (niemniej mogą).
Musi implementować wszystkie metody interfejsów Może implementować metody interfejsów
Zadanie 2

Utwórz klasę abstrakcyjną OnlineGame. Będzie wymagała, aby każda jej podklasa posiadała metodę boolean login(String name, String password).

Jej zadaniem jest zaimplementować metodę play tak, aby jej wywołanie sprawdziło najpierw, czy gracz zalogował się. Gracz loguje się wywołując metodę login.

Gdy zostanie uruchomiona metoda play, zostanie wyświetlony zostanie komunikat "playing with friends".

Zadanie 3

Utwórz własny interfejs, implementującą go klasę abstrakcyjną, po której dziedziczy zwykła klasa. Wybierz własną tematykę, użyj wszystkich mechanik i słów kluczowych przedstawionych podczas ćwiczeń.


interface Sport {
    void play();
}

class Team {
    private String name;
    public Team(String name) {
        this.name = name;
    }
    public String toString() {
        return name;
    }
}

abstract class TeamSport implements Sport {
    abstract Team teamA();
    abstract Team teamB();

    public void play() {
        System.out.println(teamA() + " plays with " + teamB());
    }
}

class Football extends TeamSport {

    private Team randomTeam() {
        return new Team("Team #" + (int)(Math.random() * 1000));
    }

    Team teamA() {
        return randomTeam();
    }

    Team teamB() {
        return randomTeam();
    }
}

public class Main {
    public static void main(String[] args) {
        Sport x = new Football();
        x.play();
    }
}