Menu
CoddyTech

Class Abstrak

Termasuk bagian Pemrograman Berorientasi Objek dalam perjalanan PHP di Coddy. Pelajaran 25 dari 91.

Abstract class adalah class yang tidak dapat dibuat instance-nya secara langsung. Abstract class berfungsi sebagai cetak biru untuk class lain, dengan mendefinisikan method yang harus diimplementasikan oleh class anak. Kamu membuat abstract class menggunakan kata kunci abstract.

<?php
abstract class Shape {
    protected $color;
    
    public function __construct($color) {
        $this->color = $color;
    }
    
    abstract public function calculateArea();
    
    public function getColor() {
        return $this->color;
    }
}

class Rectangle extends Shape {
    private $width;
    private $height;
    
    public function __construct($color, $width, $height) {
        parent::__construct($color);
        $this->width = $width;
        $this->height = $height;
    }
    
    public function calculateArea() {
        return $this->width * $this->height;
    }
}

$rect = new Rectangle("blue", 5, 3);
echo $rect->calculateArea();

output:

15

class Shape mendeklarasikan method abstrak calculateArea() tanpa menyediakan implementasi. Setiap class yang mewarisi Shape harus mengimplementasikan method ini. Perhatikan bahwa class abstrak juga dapat memiliki method biasa seperti getColor() yang langsung diwarisi oleh class anak.

Method abstrak menentukan apa yang harus dilakukan class turunan, tetapi bukan bagaimana melakukannya. Ini memastikan semua bentuk memiliki method calculateArea() sekaligus memungkinkan setiap bentuk menghitung luasnya dengan cara yang berbeda.

Poin Utama: Abstract class menggabungkan struktur pewarisan dengan persyaratan yang wajib dipenuhi. Gunakan saat kamu ingin berbagi kode di antara class yang saling terkait sekaligus memastikan setiap class turunan mengimplementasikan method tertentu.

challenge icon

Tantangan

Mudah

Mari kita buat sistem pemutar media yang menunjukkan cara abstract class menerapkan kontrak sekaligus memungkinkan berbagai tipe media menerapkan perilaku pemutarannya sendiri.

Kamu akan mengatur kodemu dalam tiga file:

  • Media.php: Definisikan abstract Media class yang menjadi cetak biru untuk semua tipe media. Class ini harus memiliki property $title dengan akses protected dan constructor yang menerima serta menetapkan title. Sertakan method abstract bernama play() yang harus diterapkan oleh child class. Tambahkan juga method biasa getTitle() yang mengembalikan title. Method konkret ini akan diwarisi oleh semua child class.
  • Song.php: Definisikan Song class yang mewarisi Media. Sertakan file Media di bagian atas. Class ini menambahkan property $artist. Constructor harus menerima title dan artist: gunakan parent::__construct() untuk title, lalu tetapkan artist sendiri. Terapkan method play() yang diwajibkan agar mengembalikan "Playing song: [title] by [artist]".
  • Podcast.php: Definisikan Podcast class yang mewarisi Media. Sertakan file Media di bagian atas. Class ini menambahkan property $episode (bilangan bulat). Constructor harus menerima title dan nomor episode: gunakan parent::__construct() untuk title, lalu tetapkan episode. Terapkan method play() yang diwajibkan agar mengembalikan "Playing podcast: [title] - Episode [episode]".

Di main.php, sertakan file Song dan Podcast. Kamu akan menerima empat input: title lagu, nama artist, title podcast, dan nomor episode (sebagai string yang perlu diubah menjadi bilangan bulat). Buat object Song dan Podcast dengan nilai-nilai ini. Cetak hasil pemanggilan play() pada lagu terlebih dahulu, lalu pada podcast, masing-masing di baris tersendiri.

Tantangan ini menunjukkan cara abstract class menetapkan kontrak: setiap tipe media harus memiliki method play(), tetapi setiap tipe menerapkannya dengan cara berbeda. Abstract Media class tidak dapat dibuat menjadi instance secara langsung, class ini hanya ada untuk menyediakan struktur dan fungsionalitas bersama bagi child class-nya.

Coba sendiri

<?php
require_once 'Song.php';
require_once 'Podcast.php';

// Baca input
$songTitle = trim(fgets(STDIN));
$artistName = trim(fgets(STDIN));
$podcastTitle = trim(fgets(STDIN));
$episodeNumber = intval(trim(fgets(STDIN)));

// TODO: Buat object Song dengan songTitle dan artistName

// TODO: Buat object Podcast dengan podcastTitle dan episodeNumber

// TODO: Cetak hasil pemanggilan play() pada lagu

// TODO: Cetak hasil pemanggilan play() pada podcast

?>
quiz iconUji dirimu

Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.

Semua pelajaran di Pemrograman Berorientasi Objek

Latihan sendiri: Compiler PHP online