Pertemuan 13 PBO A - Implementasi Abstraction

Implementasi Abstraction

Nama : Dapunta Adyapaksi Ratyanasja
NRP : 5025231187
Tugas : Pertemuan 13

Latihan 1

Tuliskan implementasi dari program kecil Abstract Class Makhluk hidup yang diwariskan kepada manusia, hewan, dan tumbuhan

class livingBeing {
    public void bernapas() {
        System.out.println("Makhluk hidup bernapas.");
    }
    public void bergerak() {
        System.out.println("Makhluk hidup bergerak.");
    }
}
Class livingBeing adalah kelas induk yang akan diwarisi oleh kelas lain.
Terdapat 2 metode, yaitu :
  - bernapas() : Metode default untuk mencetak "Makhluk hidup bernapas."
  - bergerak() : Metode default untuk mencetak "Makhluk hidup bergerak."

class Human extends livingBeing {
    @Override
    public void bernapas() {
        System.out.println("Manusia bernapas menggunakan paru-paru.");
    }
    @Override
    public void bergerak() {
        System.out.println("Manusia bergerak dengan berjalan atau berlari.");
    }
}
Subclass Human mewakili manusia. Ketika metode bernapas() atau bergerak() dipanggil pada objek Human, versi yang didefinisikan dalam Human yang akan dijalankan.

class Animal extends livingBeing {
    @Override
    public void bernapas() {
        System.out.println("Hewan bernapas menggunakan paru-paru atau insang.");
    }
    @Override
    public void bergerak() {
        System.out.println("Hewan bergerak dengan berjalan, berenang, atau terbang.");
    }
}
Subclass Animal mewakili hewan. Ketika metode bernapas() atau bergerak() dipanggil pada objek Animal, versi yang didefinisikan dalam Animal yang akan dijalankan.

class Plant extends livingBeing {
    @Override
    public void bernapas() {
        System.out.println("Tumbuhan bernapas melalui stomata.");
    }

    @Override
    public void bergerak() {
        System.out.println("Tumbuhan bergerak dengan tumbuh ke arah cahaya.");
    }
}
Subclass Plant mewakili tumbuhan. Ketika metode bernapas() atau bergerak() dipanggil pada objek Plant, versi yang didefinisikan dalam Plant yang akan dijalankan.

public class Main {
    public static void main(String[] args) {

        // Membuat objek dari masing-masing subclass
        livingBeing manusia = new Human();
        livingBeing hewan = new Animal();
        livingBeing tumbuhan = new Plant();

        // Memanggil metode yang dioverride
        System.out.println("Manusia:");
        manusia.bernapas();
        manusia.bergerak();

        System.out.println("\nHewan:");
        hewan.bernapas();
        hewan.bergerak();

        System.out.println("\nTumbuhan:");
        tumbuhan.bernapas();
        tumbuhan.bergerak();
    }
}

Membuat Object
  -  livingBeing manusia = new Human();
  -  livingBeing hewan = new Animal();
  -  livingBeing tumbuhan = new Plant();
Objek dibuat, tetapi ditampung dalam variabel bertipe livingBeing untuk menunjukkan polimorfisme.

Print Output
Metode dipanggil untuk masing-masing objek

Screenshot













Latihan 2

Pelajari dan baca simulasi Foxes and Rabbit yang ada di buku. Kemudian buat program perubahan dari struktur class umum menjadi bentuk Abstract Class.

A. Import Library

import java.util.ArrayList;
import java.util.List;
import java.util.Random;

B. Class Animal

abstract class Animal {
    private boolean alive;
    private Field field;
    private Location location;

    public Animal(Field field, Location location) {
        this.alive = true;
        this.field = field;
        setLocation(location);
    }

    public boolean isAlive() {
        return alive;
    }

    public void setDead() {
        alive = false;
        field.clear(location);
    }

    public Location getLocation() {
        return location;
    }

    public void setLocation(Location newLocation) {
        if (location != null) {
            field.clear(location);
        }
        location = newLocation;
        field.place(this, newLocation);
    }

    public abstract void act(List<Animal> animals);

    protected Field getField() {
        return field;
    }
}

class Animal adalah kelas abstrak yang mendefinisikan perilaku dasar semua hewan. Di dalamnya terdapat beberapa property seperti :

private boolean alive; // Menyimpan status hidup/mati hewan
private Field field; // Merujuk ke tempat atau lapangan tempat hewan berada
private Location location; // Lokasi hewan di lapangan

public Animal(Field field, Location location) {
    this.alive = true;
    this.field = field;
    setLocation(location);
}
Konstruktor Animal menginisialisasi objek hewan dengan status hidup, menetapkan lapangan dan lokasi.

public boolean isAlive() {
    return alive;
}
Mengecek apakah hewan masih hidup.

public void setDead() {
    alive = false;
    field.clear(location);
}
Mengubah status hewan menjadi mati dan membersihkan lokasi di lapangan.

public Location getLocation() {
    return location;
}

public void setLocation(Location newLocation) {
    if (location != null) {
        field.clear(location);
    }
    location = newLocation;
    field.place(this, newLocation);
}
Mendapatkan dan menetapkan lokasi hewan di lapangan.

public abstract void act(List<Animal> animals);
Metode abstrak yang harus diimplementasikan oleh kelas turunan untuk mendefinisikan tindakan hewan.

protected Field getField() {
    return field;
}
Mengakses lapangan tempat hewan berada.

C. Class Rabbit

class Rabbit extends Animal {
    public Rabbit(Field field, Location location) {
        super(field, location);
    }

    @Override
    public void act(List<Animal> animals) {
        if (isAlive()) {
            Location newLocation = getField().freeAdjacentLocation(getLocation());
            if (newLocation != null) {
                setLocation(newLocation);
            }
        }
    }
}

Class Rabbit adalah kelas turunan dari Animal, yang menggambarkan kelinci. Di dalamnya memuat beberapa property :

public Rabbit(Field field, Location location) {
    super(field, location);
}
Konstruktor Rabbit memanggil konstruktor induk Animal untuk mengatur lapangan dan lokasi.

@Override
public void act(List<Animal> animals) {
    if (isAlive()) {
        Location newLocation = getField().freeAdjacentLocation(getLocation());
        if (newLocation != null) {
            setLocation(newLocation);
        }
    }
}
Jika kelinci masih hidup, kelinci akan bergerak ke lokasi bebas yang ada di sekitarnya (menggunakan metode freeAdjacentLocation() pada kelas Field).

D. Class Fox

class Fox extends Animal {
    public Fox(Field field, Location location) {
        super(field, location);
    }

    @Override
    public void act(List<Animal> animals) {
        if (isAlive()) {
            Location preyLocation = getField().findPrey(getLocation(), Rabbit.class);
            if (preyLocation != null) {
                Animal prey = getField().getAnimalAt(preyLocation);
                if (prey != null && prey instanceof Rabbit) {
                    prey.setDead();
                    animals.remove(prey);
                    System.out.println("Moment fox menangkap rabbit pada titik: " + preyLocation);
                }
                setLocation(preyLocation);
            } else {
                Location newLocation = getField().freeAdjacentLocation(getLocation());
                if (newLocation != null) {
                    setLocation(newLocation);
                }
            }
        }
    }
}

Class Fox adalah kelas turunan dari Animal, yang menggambarkan rubah. Di dalamnya memuat beberapa property :

public Fox(Field field, Location location) {
    super(field, location);
}
Konstruktor Fox memanggil konstruktor induk Animal untuk mengatur lapangan dan lokasi.

@Override
public void act(List<Animal> animals) {
    if (isAlive()) {
        Location preyLocation = getField().findPrey(getLocation(), Rabbit.class);
        if (preyLocation != null) {
            Animal prey = getField().getAnimalAt(preyLocation);
            if (prey != null && prey instanceof Rabbit) {
                prey.setDead();
                animals.remove(prey);
                System.out.println("Moment fox menangkap rabbit pada titik: " + preyLocation);
            }
            setLocation(preyLocation);
        } else {
            Location newLocation = getField().freeAdjacentLocation(getLocation());
            if (newLocation != null) {
                setLocation(newLocation);
            }
        }
    }
}
  • Jika rubah masih hidup, rubah akan mencari kelinci di sekitarnya menggunakan metode findPrey().
  • Jika ditemukan kelinci, rubah akan membunuhnya (mengubah status kelinci menjadi mati dan menghapusnya dari daftar animals).
  • Rubah akan berpindah ke lokasi kelinci yang ditangkap atau bergerak ke lokasi kosong di sekitarnya jika tidak menemukan kelinci.
E. Class Location

class Location {
    private int row;
    private int col;

    public Location(int row, int col) {
        this.row = row;
        this.col = col;
    }

    public int getRow() {
        return row;
    }

    public int getCol() {
        return col;
    }

    @Override
    public String toString() {
        return "(" + row + ", " + col + ")";
    }
}

Class Location menggambarkan lokasi tertentu di dalam lapangan menggunakan koordinat row dan col.

F. Class Field

class Field {
    private Animal[][] field;
    private int rows;
    private int cols;

    public Field(int rows, int cols) {
        this.rows = rows;
        this.cols = cols;
        field = new Animal[rows][cols];
    }

    public void clear(Location location) {
        field[location.getRow()][location.getCol()] = null;
    }

    public void place(Animal animal, Location location) {
        field[location.getRow()][location.getCol()] = animal;
    }

    public Animal getAnimalAt(Location location) {
        return field[location.getRow()][location.getCol()];
    }

    public Location freeAdjacentLocation(Location location) {
        List<Location> free = new ArrayList<>();
        for (int dr = -1; dr <= 1; dr++) {
            for (int dc = -1; dc <= 1; dc++) {
                int newRow = location.getRow() + dr;
                int newCol = location.getCol() + dc;
                if (isValidLocation(newRow, newCol) && field[newRow][newCol] == null) {
                    free.add(new Location(newRow, newCol));
                }
            }
        }
        if (!free.isEmpty()) {
            return free.get(new Random().nextInt(free.size()));
        }
        return null;
    }

    public Location findPrey(Location location, Class<?> preyClass) {
        for (int dr = -1; dr <= 1; dr++) {
            for (int dc = -1; dc <= 1; dc++) {
                int newRow = location.getRow() + dr;
                int newCol = location.getCol() + dc;
                if (isValidLocation(newRow, newCol)) {
                    Animal animal = field[newRow][newCol];
                    if (animal != null && preyClass.isInstance(animal)) {
                        return new Location(newRow, newCol);
                    }
                }
            }
        }
        return null;
    }

    private boolean isValidLocation(int row, int col) {
        return row >= 0 && row < rows && col >= 0 && col < cols;
    }
}

Class Field menggambarkan lapangan tempat hewan berada. Ini adalah matriks dua dimensi (field), di mana setiap elemen menyimpan referensi ke objek Animal.

G. Class Main

public class Main {
    public static void main(String[] args) {
        int steps = 10; // Inisialisasi jumlah langkah
        int initialRabbitCount = 5; // Inisialisasi jumlah kelinci
        Field field = new Field(10, 10);
        List<Animal> animals = new ArrayList<>();

        // Tambahkan kelinci ke dalam simulasi
        for (int i = 0; i < initialRabbitCount; i++) {
            animals.add(new Rabbit(field, new Location(i, i)));
        }
        // Tambahkan rubah ke dalam simulasi
        animals.add(new Fox(field, new Location(7, 7)));
        animals.add(new Fox(field, new Location(9, 9)));

        // Menampilkan informasi awal
        System.out.println("Step: " + steps);
        System.out.println("Jumlah Awal Rabbit: " + initialRabbitCount);

        // Simulasi langkah
        for (int step = 0; step < steps; step++) {
            System.out.println("\nStep : " + (step + 1));

            List<Animal> newAnimals = new ArrayList<>();
            for (Animal animal : animals) {
                if (animal.isAlive()) {
                    animal.act(animals);
                }
            }

            // Menampilkan jumlah sisa kelinci
            long remainingRabbits = animals.stream().filter(a -> a instanceof Rabbit && a.isAlive()).count();
            System.out.println("Sisa rabbit: " + remainingRabbits);

            System.out.println("------------------------------");
        }
    }
}
  • Pada bagian Main, simulasi dimulai dengan mendefinisikan lapangan (10x10), dan jumlah langkah yang akan dijalankan.
  • Kelinci dan rubah ditambahkan ke dalam daftar animals.
  • Setiap langkah (loop) akan memperbarui posisi dan status setiap hewan berdasarkan aksi mereka.
  • Setelah setiap langkah, jumlah kelinci yang masih hidup akan dihitung dan ditampilkan.
H. Output









Komentar

Postingan Populer