Saturday, April 26, 2014

Polymorphism dalam bahasa pemogrman C#

Polymorphism berasal dari bahasa yunani yang berarti banyak bentuk. Polymorphism memiliki dua buah karakteristik, yaitu :
1. Sebuah pointer dari class tertentu tidak hanya dapat mengacu pada class tersubut saja, namun ia juga dapat menampung objek dari class-class anak nya.

Saya mempunyai class parent bernama Hewan,
Class Hewan mempunyai keturunan yaitu class HewanDarat dan class HewanAir
Class HewanDarat memiliki method Berjalan()
Class HewanAir memiliki method Berenang()

Kasus :
Bagaimana caranya jika saya ingin menyuruh semua objek dari class HewanDarat untuk berjalan dan semua objek dari class HewanAir untuk berenang.


Program :

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Latihan1
{
    class Program
    {
        static void Main(string[] args)
        {
            Hewan[] hewans = new Hewan[4];

            hewans[0] = new HewanDarat();
            hewans[1] = new HewanDarat();
            hewans[2] = new HewanAir();
            hewans[3] = new HewanAir();

            //Memerintahkan semua objek HewanDarat untuk berjalan
            //Dan semua objek HewanAir untuk berenang

            for (int i = 0; i < 4; i++)
            {
                if (hewans[i] is HewanDarat)
                    (hewans[i] as HewanDarat).Berjalan();
                if (hewans[i] is HewanAir)
                    (hewans[i] as HewanAir).Berenang();
            }
        }
    }
}

Output :

Mengapa kita tidak bisa langsung mengetikan perintah hewans[i].Berjalan() atau hewans[i].Berenang() ?
Yiatu karena hewans adalah pointer dari array class Hewan() (parent class), bukan pointer dari class HewanDarat / HewanAir. sehingga ketika pembuatan objek, objek tersebut memang menjadi objek dari class HewanDarat / HewanAir namun hanya memiliki anggota / field dari class Hewan.
Untuk itu kita harus mengunakan keyword as untuk menyatakan bahwa objek tersebut sepenuhnya sebagai objek dari class HewanDarat / HewanAir.

hewans[i] is HewanDarat (mengecek apakah hewans[i] adalah objek dari HewanDarat)
hewans[i] as HewanDarat (menyatakan bahwa hewan[i] digunakan sepenuhnya sebagai objek dari class HewanDarat)

2. Sebuah metod yang sama bisa memiliki banyak implementasi.
Sebuah class akan menurunkan semua anggoota class nya kepada class-class turunannya. Polymorphism memungkinkan sebuah class untuk menimpa (override) method method yang di turunkan kepadanya. Polymorphism juga memungkinkan sebuah class untuk membuat method baru yang sama dengan method yang di turunkan kepadanya. Dengan demikian, method yang merupakan turunan dari class parent akan disembunyikan secara otomatis.
Jadi, sebuah method yang bernama sama yang dimiliki oleh sebuah class serta turunannya dapat memiliki banyak implementasi. Satu method memiliki banyak implementasi inilah yang di maksud dengan banyak bentuk.

Menggunakn keyword virtual dan override
Misalkan Saya mempunyai sebuah class parent Hewan yang memiliki method MempertahankanDiri()

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Latihan1
{
    class Hewan
    {
        private int _umur = 1;
        private string _nama = "Belum punya nama";

        public int umur
        {
            get { return _umur; }
            set
            {
                if (value > 0)
                    _umur = value;
                else
                    _umur = 1;
            }
        }

        public string nama
        {
            get { return _nama; }
            set { _nama = value; }
        }

        public virtual void MempertahankanDiri()
        {
            Console.WriteLine("Hewan Sedang mempertahankan diri");
        }

    }
}
Kemudian Saya ingin menimpa method MempertahankanDiri() pada class HewanDarat yang merupakan turunan dari class Hewan() dengan isi method yang berbeda.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Latihan1
{
    class HewanDarat : Hewan
    {
        public HewanDarat()
        {
            umur = 2;
        }

        public void Berjalan()
        {
            Console.WriteLine("Sedang berjalan ...!!!");
        }

        public override void MempertahankanDiri()
        {
            Console.WriteLine("Hewan darat berlali dengan sangat cepat ...!!");
        }
    }
}
Keyword virtual yang terletak pada method MempertahankanDiri() pada class Hewan untuk menyatakan bahwa method tersebut boleh di timpa dengan method yang bernama sama pada class turunannya.
Sedangkan keyword override yang terletak pada method MempertahankanDiri() pada class hewan berfungsi untuk menimpa method MempertahankanDiri() yang di turunkan dari class Hewan.

Menggunakan keyword new
Jika kita menggunakan keyword new pada method class turunannya itu berarti kita tidak menimpa method MempertahankanDiri() class Hewan namun hanya Membuat method MempertahankanDiri() yang baru dan menyembunyikan method MempertahankanDiri() dari class Hewan. Jika kita menggunakan keyword new, kita tidak usah memakai keyword virtual pada method parentnnya.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Latihan1
{
    class HewanDarat : Hewan
    {
        public HewanDarat()
        {
            umur = 2;
        }

        public void Berjalan()
        {
            Console.WriteLine("Sedang berjalan ...!!!");
        }

        public new void MempertahankanDiri()
        {
            Console.WriteLine("Hewan darat berlali dengan sangat cepat ...!!");
        }
    }
}

Catatan :
Jika kita menggunakan keyword new kita masih bisa menggunakan keyword MempertahankanDiri() milik class Hewan, namun jika kita menggunakan keyword override kita tidak bisa lagi menggunakan method MempertahankanDiri() dari class Hewan() karena method tersebut sudah di timpa.

contoh :
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Latihan1
{
    class Program
    {
        static void Main(string[] args)
        {
            Hewan[] hewans = new Hewan[4];

            hewans[0] = new HewanDarat();
            hewans[1] = new HewanDarat();
            hewans[2] = new HewanAir();
            hewans[3] = new HewanAir();

            //Memerintahkan semua objek HewanDarat untuk berjalan
            //Dan semua objek HewanAir untuk berenang

            HewanDarat kucing = new HewanDarat();

            kucing.MempertahankanDiri();
            (kucing as Hewan).MempertahankanDiri();
        }
    }
}

Output :