// Class abstrak: cetak biru parsial yang tidak bisa diinstansiasi langsung.
abstract class Bentuk {
    // Field dan constructor tetap boleh ada: dipakai oleh subclass lewat super().
    protected final String nama;

    protected Bentuk(String nama) {
        this.nama = nama;
    }

    // Method abstrak: hanya deklarasi, tanpa body.
    // Setiap subclass wajib menyediakan implementasinya.
    public abstract double luas();

    public abstract double keliling();

    // Method konkret: perilaku bersama yang diwariskan apa adanya.
    public String deskripsi() {
        return nama + " dengan luas " + String.format("%.2f", luas());
    }
}
