Pertemuan 12: Implementasi Abstract Class

Tugas Pertemuan 12 

Nama: Farrel Aqilla Novianto

NRP: 5025241015

Kelas: Pemrograman Berorientasi Objek (A)

Source Code

Abstract Class

Abstract class adalah kelas yang terletak pada posisi tertinggi pada hierarki kelas. Kelas ini digunakan sebagai basis bagi penurunan kelas lainnya, sehingga abstract class tidak dapat diinstansiasi secara langsung menjadi object. Suatu abstract class bisa mengandung method kongkrit dan/atau method abstract. Abstract method meruapakan suatu method yang tidak mempunyai badan method. Hanya berupa nama method dan parameter inputan method. Ketika suatu abstract class diturunkan/diextends, maka subclass harus mengimplementasikan semua method abstract pada parent/base class. Jika tidak mengimplementasikan semua method abstract maka subclass harus dideklarasikan sebagai abstract class.

Interface

Interface adalah kumpulan method yang hanya memuat deklarasi dan struktur method, tanpa detail implementasinya. Sedangkan detail dari method berada pada class yang mengimplementasikan interface tersebut. Interface digunakan bila Anda ingin mengaplikasikan suatu method yang spesifik, yang tidak diperoleh dari proses inheritance. Tipe data yang boleh pada interface hanya tipe data konstan.

Latihan

  1. Tuliskan implementasi dari program kecil Abstract Class Makhluk hidup yang diwariskan kepada manusia, hewan, dan tumbuhan.
  2. Pelajari dan baca simulasi Foxes and Rabbit yang ada di buku. Kemudian buat program perubahan dari struktur class umum menjadi bentuk Abstract Class.
Berikut adalah kode dan dokumentasi untuk menjawab nomor 1:

Kode MakhlukHidup.java

/**
 * @author Farrel Aqilla Novianto
 */
public abstract class MakhlukHidup {
   
   public abstract void berdiri ();
   
   public void oksigen(){
       System.out.println("- butuh Makanan");
       System.out.println("- butuh oksigen");
       System.out.println("- butuh air");
   }     
}

Kode Hewan.java

/**
 * @author Farrel Aqilla Novianto
 */
public class Hewan extends MakhlukHidup {
    private String kakiEmpat, kakiDua ;
    public Hewan(String kakiEmpat, String kakiDua){
        this.kakiEmpat = kakiEmpat;
        this.kakiDua   = kakiDua;
    }
    
    public void berdiri (){
        System.out.println("Kambing berdiri menggunakan :  " +kakiEmpat);
        System.out.println("Ayam berdiri menggunakan    :  " + kakiDua);
    }    
}

Kode Manusia.java

/**
 * @author Farrel Aqilla Novianto
 */
public class Manusia extends MakhlukHidup {
    private String duaKaki;
    public Manusia(String duaKaki){
        this.duaKaki = duaKaki;
    }
    public void berdiri (){
        System.out.println("Manusia berdiri menggunakan :  "+duaKaki);
    }
}

Kode Tumbuhan.java

/**
 * @author Farrel Aqilla Novianto
 */
public class Tumbuhan extends MakhlukHidup {
    private String Akar;
    public Tumbuhan (String Akar){
        this.Akar = Akar;
    }
    public void berdiri (){
        System.out.println("Tumbuhan berdiri dengan     :  "+Akar);
    }
}

Kode Main.java

/**
 * @author Farrel Aqilla Novianto
 */
public class Main {
    public void cekMakhlukHidup (MakhlukHidup mHidup){
        mHidup.berdiri();
        mHidup.oksigen();
    }
    
    public static void main(String[] args){
        Main tMakhlukHidup = new Main();        
        
        tMakhlukHidup.cekMakhlukHidup(new Manusia("Dua Kaki"));       
        
        System.out.println("-----------------------------------------");                              
        tMakhlukHidup.cekMakhlukHidup(new Hewan ("Empat Kaki","Dua Kaki"));
        
        System.out.println("-----------------------------------------");        
        tMakhlukHidup.cekMakhlukHidup(new Tumbuhan ("Akar"));
    }
}

Dokumentasi


Berikut adalah kode dan dokumentasi untuk menjawab nomor 2:

Kode Animal.java

/**
 * @author Farrel Aqilla Novianto
 */
import java.util.List;

public abstract class Animal{
    private int age;
    private boolean alive;
    private Field field;
    private Location location;
    
    public Animal(Field field, Location location){
        this.age = 0;
        this.alive = true;
        this.field = field;
        setLocation(location);
    }
    
    public boolean isAlive(){
        return alive;
    }
    
    public void setDead(){
        alive = false;
        if(location != null){
            field.clear(location);
            location = null;
            field = null;
        }
    }
    
    public Location getLocation(){
        return location;
    }
    
    public void setLocation(Location newLocation){
        if(location != null){
            field.clear(location);
        }
        location = newLocation;
        field.place(this, newLocation);
    }
    
    protected Field getField(){
        return field;
    }
    
    protected int getAge(){
        return age;
    }
    
    protected void incrementAge(){
        age++;
    }
    public abstract void act(List<Animal> newAnimals);
}

Kode Rabbit.java

/**
 * @author Farrel Aqilla Novianto
 */
import java.util.List;

public class Rabbit extends Animal {
    
    public Rabbit(Field field, Location location){
        super(field, location);
    }
    
    @Override
    public void act(List<Animal> newAnimals){
        if(isAlive()){
            Location newLocation = getField().freeAdjacentLocation(getLocation());
            if(newLocation != null){
                setLocation(newLocation);
            } 
            else{
                setDead();
            }
        }
    }
}

Kode Fox.java

/**
 * @author Farrel Aqilla Novianto
 */
import java.util.List;

public class Fox extends Animal{
    
    public Fox(Field field, Location location){
        super(field, location);
    }
    
    @Override
    public void act(List<Animal> newAnimals){
        if(isAlive()){
            Location newLocation = findFood();
            if(newLocation == null){
                newLocation = getField().freeAdjacentLocation(getLocation());
            }
            if(newLocation != null){
                setLocation(newLocation);
            } 
            else{
                setDead();
            }
        }
    }
    
    private Location findFood(){
        List<Location> adjacent = getField().adjacentLocations(getLocation());
        for(Location loc : adjacent){
            Object animal = getField().getObjectAt(loc);
            if(animal instanceof Rabbit){
                Rabbit rabbit = (Rabbit) animal;
                rabbit.setDead();
                return loc;
            }
        }
        return null;
    }
}

Kode Field.java

/**
 * @author Farrel Aqilla Novianto
 */
import java.util.List;
import java.util.ArrayList;

public class Field{
    private Object[][] field;
    
    public Field(int depth, int width){
        field = new Object[depth][width];
    }
    
    public void clear(Location location){
        field[location.getRow()][location.getCol()] = null;
    }
    
    public void place(Object object, Location location){
        field[location.getRow()][location.getCol()] = object;
    }
    
    public Object getObjectAt(Location location){
        return field[location.getRow()][location.getCol()];
    }
    
    public Location freeAdjacentLocation(Location location){
        List<Location> free = new ArrayList<>();
        List<Location> adjacent = adjacentLocations(location);
        for(Location loc : adjacent){
            if(getObjectAt(loc) == null){
                free.add(loc);
            }
        }
        return free.isEmpty() ? null : free.get(0);
    }
    
    public List<Location> adjacentLocations(Location location){
        List<Location> locations = new ArrayList<>();
        int row = location.getRow();
        int col = location.getCol();
        for(int roffset = -1; roffset <= 1; roffset++){
            int nextRow = row + roffset;
            if(nextRow >= 0 && nextRow < field.length){
                for(int coffset = -1; coffset <= 1; coffset++){
                    int nextCol = col + coffset;
                    if(nextCol >= 0 && nextCol < field[0].length && (roffset != 0 || coffset != 0)){
                        locations.add(new Location(nextRow, nextCol));
                    }
                }
            }
        }
        return locations;
    }
    
    public int getDepth(){
        return field.length;
    }
    
    public int getWidth(){
        return field[0].length;
    }
}

Kode Location.java

/**
 * @author Farrel Aqilla Novianto
 */
public 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;
    }
}

Kode Simulator.java

/**
 * @author Farrel Aqilla Novianto
 */
import java.util.ArrayList;
import java.util.List;
import java.util.Random;

public class Simulator {
    private Field field;
    private List<Animal> animals;
    
    public Simulator(int depth, int width){
        field = new Field(depth, width);
        animals = new ArrayList<>();
        populate();
    }
    
    public void simulate(int steps){
        for(int step = 1; step <= steps; step++){
            List<Animal> newAnimals = new ArrayList<>();
            for(Animal animal : animals){
                animal.act(newAnimals);
            }  
            animals.addAll(newAnimals); 
            animals.removeIf(animal -> !animal.isAlive());
            System.out.println("Step " + step + ": " + countAnimals());
        }
    }
    
    private void populate(){
        Random rand = new Random();
        int depth = field.getDepth();
        int width = field.getWidth();
        for(int row = 0; row < depth; row++){
            for(int col = 0; col < width; col++){
                double random = rand.nextDouble();
                Location location = new Location(row, col);
                if(random <= 0.08){
                    Fox fox = new Fox(field, location);
                    animals.add(fox);
                } 
                else if(random <= 0.20){
                    Rabbit rabbit = new Rabbit(field, location);
                    animals.add(rabbit);
                }
            }
        }
        System.out.println("Populasi awal: " + countAnimals());
    }
    
    private String countAnimals(){
        int foxCount = 0;
        int rabbitCount = 0;
        
        for(Animal animal : animals){
            if(animal instanceof Fox){
                foxCount++;
            }
            else if(animal instanceof Rabbit){
                rabbitCount++;
            }
        }
        return "Foxes = " + foxCount + ", Rabbits = " + rabbitCount;
    }
    
    public static void main(String[] args){
        System.out.println("SIMULASI FOXES AND RABBITS");
        Simulator simulator = new Simulator(20, 20);
        simulator.simulate(10);
    }
}

Dokumentasi

Kesimpulan

Abstract Class adalah kerangka kerja yang tidak dapat dibuat objeknya secara langsung dan digunakan untuk mendefinisikan metode umum (abstrak dan konkret) bagi kelas turunan. Hal ini memungkinkan pengembang untuk mencapai abstraksi dengan fokus pada fungsionalitas inti, menyediakan struktur modular, mengurangi duplikasi kode, dan membangun hierarki kelas yang terorganisir. Kelas turunan (subkelas) wajib mengimplementasikan semua metode abstrak agar dapat menjadi kelas konkret (dapat diinstansiasi).

Komentar

Postingan populer dari blog ini

Final Project: Tetris

Pertemuan 4: Membuat Clock Display