Please Kindly Share To Your Social Media

Polymorphism


Dari arti kata kita bisa tebah yaitu Banyak Bentuk. Dalam dunia OOP programming,

Polymorphism adalah konsep fundamental dimana class-class mempunyai fungsi berbeda akan tetapi berbagi interface yang sama. 


Contoh 

Class HP_Samsung,Class HP_Nokia,Class HP_Sony mereka semua mempunyai cara kerja yang berbeda
masing-masing namun pada dasarnya fungsinya sama.

Contoh HP_Samsung,HP_Nokia,HP_Sony bisa kirim sms namun tentu dengan cara kerja yang berbeda masing-masing bukan ?


Secara sederhana kira-kira seperti itulah Polymorphism. Dalam Polymorphism ada 2 cara yang umum digunakan yaitu : Interface dan Abstract Class


Interface


Interface memiliki konsep sama dengan Class yakni tidak ada kode-kode didalamnya. Dan hanya boleh ada Method dan Argument  dan lagi tidak boleh ada kode didalam method-method tersebut


Membuat interface : 
interface MyInterface{
   //method-method
}

contoh dengan method
interface MyInterface{
   public function bebas();
   public function bebas2($param);
}

Semua method di Interface harus bersifat Public (tidak boleh ada private atau protected method)

Interface + Class

Jika class ingin pakai Interface, pakai keywords implements:

class MyClass implements MyInterface{..}

1 (satu) Class bisa implement ebih dari satu interface

class MyClass implements MyInterface,MyInterface2,MyInterface3{..}

Interface bisa dibilang adalah spesifikasi dasar dari sebuah class (tergantung class yang akan memakainya)
oleh karena itu jika suatu class ingin menggunakan Interface maka semua method yang ada di interface harus terdapat di dalam Class tersebut. Namun mesti diingat bahwa Interface bukanlah Class

interface KendaraanBermotor{
    public function ngeRem();
    public function ngeGas();
    public function mundur();
}
class Mobil implements KendaraanBermotor{
    
    protected $jml_roda;
    
    public function ngeRem(){
        
        return "Ngerem nya pakai Tuas dikaki doang";
    }
    public function ngeGas(){
        
        return "Ngegas nya pakai tuas dikaki";
    }   
    public function mundur(){
        
        return "Ada kontrol khusus mundur, orang gperlu turun";
    }
    
}
class Motor implements KendaraanBermotor{
    
    protected $jml_roda;
    
    public function ngeRem(){
        
        return "Ngerem nya pakai Tuas dikaki atau ditangan";
    }
    public function ngeGas(){
        
        return "Ngegas nya pakai tangan";
    }   
    public function mundur(){
        
        return "Mundur perlu turun atau dorong pake kaki";
    }
    
}
//buat Object
$obj = new Mobil();
echo $obj->ngeGas();
echo $obj->ngeRem();
echo $obj->mundur();

perhatikan dalam 2 kelas diatas semua method yang ada di interface harus ada,
 jika tidak maka error. Perhatikan juga jika kita ingin pakai Class motor, hanya
 perlu ubah satu baris kode 

$obj = new Mobil();  menjadi $obj = new Motor();

Memang sebenarnya contoh diatas terlalu mudah dan belum 'real' Polymorphism, tapi setidaknya bagi yang mulai belajar akan mendapat gambaran sedikit.

Lanjut...Setelah membuat 2 Class Motor dan Mobil seperti diatas, misalnya ternyata kita butuh 1 Class lagi  untuk berinteraksi dengan kedua class tersebut. Misal kita buat class Customer dan class Customer ini  bisa mengecek apakah mobil atau motor nya dijual dan fungsi-fungsi lainnya
(tambahkan sendiri jika perlu). 

Skenarionya adalah misalkan kita mempunyai satu aplikasi Showroom kendaraan (Khusus Mobil dan motor saja).
Kita sudah pisahkan mereka menjadi 2 Class masing-masing, namun jika ada yang hendak membeli (Customer) entah itu  membeli Mobil atau Motor, si Customer harus sudah menjadi member terdaftar di aplikasi kita.

Kita tulis ulang Kode diatas menjadi

interface KendaraanBermotor{
    public function ngeRem();
    public function ngeGas();
    public function mundur();
    public function isMember(); //perhatikan...
}
class Mobil implements KendaraanBermotor{
    
    protected $is_member = false;
    
    public function __construct($identify=null){
        
        if($identify){
            
            $this->is_member = $identify;
        }
    }
    
    //...
    
    public function isMember(){
        
        return $this->is_member;
    }
    
}
class Motor implements KendaraanBermotor{
    
    //misal buat propertiesnya
    protected $is_member = false; 
    
    public function __construct($identify=null){
        
        if($identify){
            
            $this->is_member = $identify;
        }
    }
    
    //...
    
    public function isMember(){
        
        return $this->is_member;
    }
}
/*Perhatikan Class berikut*/
class Customer{
    
    private $obj;
    
    //pakai typeHinting : KendaraanBermotor $obj
    public function __construct(KendaraanBermotor $obj){
        
        $this->obj = $obj;
    }
    public function beli(){
    
        if(!$this->obj->isMember()){
        
            return "Maaf Anda belum menjadi member";
        }
        
        return "Welcome back Bro !!, Mau beli ? ";
    }
   
}

Misal si Pengunjung sekarang sedang dihalaman Listing Motor
lalu berniat untuk membeli Motor dengan menekan tombol BELI misalnya.

$obj = new Motor(false);//misal false=bukan member,coba ganti ke true
$obj2 = new Customer($obj);
echo $obj2->beli();
//Outputnya : Maaf Anda belum menjadi member

Abstract Class

Abstract Class dilihat dari penamaanya dapat kita katakan bahwa itu adalah hal yang Abstract alias tidak nyata. Abstract Class biasanya dibuat untuk diturunkan ke Class lain dengan kata lain Abstract Class akan berisi semua hal paling general dari Class-Class anaknya. Seperti Class pada umumnya, Abstract Class juga bisa mempunyai properties,hak akses,dan method namun Abstract Class tidak bisa dibuatkan Object nya sendiri.


Misalkan

abstract class Mamalia{
    abstract protected function berJalan($pakai);
    abstract protected function makan($apaan); //abstract method
}
//pakai extends
class Manusia extends Mamalia{
    public function berJalan($pakai){
    
        return "Manusia Jalan pakai {$pakai}";
    }
    
    public function makan($apaan){
    
        return "Manusia biasa makan {$apaan}";
    }
}
class Kucing extends Mamalia{
    public function berJalan($pakai){
    
        return "Kucing Jalan pakai {$pakai}";
    }
    
    public function makan($apaan){
    
        return "Kucing biasa makan {$apaan}";
    }
}

$obj = new Manusia;
echo $obj->makan("Nasi");
echo $obj->berJalan("Kaki");
echo "
";
$obj = new Kucing;
echo $obj->makan("Ikan asin");
echo $obj->berJalan("Empat kaki");

Contoh lagi : Biasanya Framework sperti CI pakai Abstract Class untuk Query Builder nya

abstract class DB
{
    protected $driver;
    
    public function __construct($dv){
    
        $this->driver = $dv;
    }
    
    public function getDriver(){
        
        return $this->driver;
    }
    
    abstract protected function select($table, $kolom);
    abstract protected function limit($lim);
}
class DbMysql extends DB
{
    public function select($table, $kolom){
    
       //...
    }
    
    public function limit($lim){
        
        //...
    }
}
class DbOracle extends DB
{
    public function select($table, $kolom){
    
       //...
    }
    
    public function limit($limt){
        
        //...
    }
    
}
//Misal penggunaannya
$db = new DbMysql('mysql'); //ganti misal DbOracle('oracle')
$db->select('users', array('id', 'nama','alamat'));
$db->limit(10);

Interface vs Abstract Class ?


Dari definisinya dan contoh-contoh nya mungkin masih bingung hendak pakai yang mana.
Perlu diingat Interface dan Abstract Class bukan untuk dibandingkan atau dipilah-pilih

tapi pakai sesuai spesifikasi design OOP aplikasi masing-masing saja dan bahkan banyak yang menggabungkan keduanya. Tapi keyword singkat yang perlu diingat adalah

jika kita rasa kita perlu menambahkan di Polymorphism itu Properties, Method yang menurut kita harus ada kode block nya, maka bisa gunakan Abstract Class. CMIIW


Contoh 

abstract class DB
{
    protected $driver;
    
    public function __construct($dv){
    
        $this->driver = $dv;
    }
    
    public function getDriver(){
        
        return $this->driver;
    }
    
    abstract protected function select($table, $kolom);
    abstract protected function limit($lim);
}

Di Abstract Class bisa kita define Properties, Method yang bisa diKode dsb.