Penjelasan dan Contoh Sederhana Polymorphism C# Asp.Net

 

Polymorphism sering disebut sebagai pilar ketiga pemrograman berorientasi objek, setelah enkapsulasi dan inheritance. Polymorphism adalah kata Yunani yang berarti "many-shaped" dan memiliki dua aspek yang berbeda:
1. Pada run - time, objek dari class turunan dapat diperlakukan sebagai objek base class di tempat-tempat seperti parameter metod dan collection atau array.
Saat ini terjadi, tipe yang dideklarasikan objek tidak lagi identik dengan tipe run-time-nya.
2. Base class dapat menentukan dan menerapkan metod virtual, dan class turunan dapat menggantikannya, yang berarti mereka memberikan definisi dan implementasinya.

Pada saat run-time, ketika client memanggil metod ini, CLR mencari jenis objek run-time, dan memanggil penggantian model metod virtual. Jadi dalam source code kita, kita dapat memanggil metod pada base class, dan menyebabkan versi class turunan dari metod yang akan dieksekusi.

Metod virtual memungkinkan kita bekerja dengan groups objects yang berhubungan secara uniform. Misalnya, kita memiliki aplikasi gambar yang memungkinkan pengguna membuat berbagai jenis shape pada permukaan gambar.

kita tidak tahu pada waktu kompilasi tipe data shape tertentu yang akan dibuat pengguna. Namun, aplikasi tersebut harus terus melacak semua tipe data shape yang dibuat, dan harus memperbaruinya sebagai respons terhadap tindakan mouse pengguna.

 kita dapat menggunakan polimorfisme untuk memecahkan masalah ini dalam dua langkah dasar:
1. Create hirarki class di mana masing-masing class shape spesifik berasal dari base class yang sama.
2. Gunakan metod virtual untuk meminta metod yang sesuai pada setiap class turunan melalui satu panggilan ke metod base class.
Pertama, create base class yang disebut Shape, dan class turunan seperti Rectangle, Circle, and Triangle.

Berikan class Shape sebuah metod virtual yang disebut Draw, dan override di setiap class turunan untuk menggambar bentuk khusus yang diwakili class.

Create List object dan tambahkan Circle, Triangle and Rectangle ke dalamnya. Untuk memperbarui drawing surface, gunakan loop foreach untuk melakukan iterasi melalui daftar dan memanggil metod Draw pada setiap objek Shape dalam list. 

Meskipun setiap objek dalam list memiliki tipe Shape yang dinyatakan, ini adalah tipe run-time (versi yang diganti dari metod di setiap class turunan) yang akan dipanggil.
using System;
using System.Collections.Generic;

public class Shape
{
    // A few example members
    public int X { get; private set; }
    public int Y { get; private set; }
    public int Height { get; set; }
    public int Width { get; set; }
   
    // Virtual method
    public virtual void Draw()
    {
        Console.WriteLine("Performing base class drawing tasks");
    }
}

class Circle : Shape
{
    public override void Draw()
    {
        // Code to draw a circle...
        Console.WriteLine("Drawing a circle");
        base.Draw();
    }
}
class Rectangle : Shape
{
    public override void Draw()
    {
        // Code to draw a rectangle...
        Console.WriteLine("Drawing a rectangle");
        base.Draw();
    }
}
class Triangle : Shape
{
    public override void Draw()
    {
        // Code to draw a triangle...
        Console.WriteLine("Drawing a triangle");
        base.Draw();
    }
}

class Program
{
    static void Main(string[] args)
    {
        // Polymorphism at work #1: a Rectangle, Triangle and Circle
        // can all be used whereever a Shape is expected. No cast is
        // required because an implicit conversion exists from a derived 
        // class to its base class.
        var shapes = new List
        {
            new Rectangle(),
            new Triangle(),
            new Circle()
        };

        // Polymorphism at work #2: the virtual method Draw is
        // invoked on each of the derived classes, not the base class.
        foreach (var shape in shapes)
        {
            shape.Draw();
        }

        // Keep the console open in debug mode.
        Console.WriteLine("Press any key to exit.");
        Console.ReadKey();
    }

}

/* Output:
    Drawing a rectangle
    Performing base class drawing tasks
    Drawing a triangle
    Performing base class drawing tasks
    Drawing a circle
    Performing base class drawing tasks
 */

  • Polymorphism Overview


Virtual Members
Ketika class turunan inheritance dari base class, ia memperoleh semua metod, field, properti dan event base class. Perancang class turunan bisa memilih
1. Override virtual members di base class
2. Inheritance metod base class terdekat tanpa mengesampingkannya
3. Mendefinisikan implementasi non-virtual baru dari member yang menyembunyikan implementasi
base class
Class turunan dapat menggantikan member base class hanya jika member base class dinyatakan virtual atau abstrak.

Member turunan harus menggunakan keyword pengganti untuk secara eksplisit menunjukkan bahwa metod ini dimaksudkan untuk berpartisipasi dalam virtual invocation. Code berikut memberikan contoh:
public class BaseClass
{
    public virtual void DoWork() { }
    public virtual int WorkProperty
    {
        get { return 0; }
    }
}
public class DerivedClass : BaseClass
{
    public override void DoWork() { }
    public override int WorkProperty
    {
        get { return 0; }
    }
}
Field tidak bisa virtual; Hanya metod, properti, events dan pengindeks yang bisa bersifat virtual. Ketika sebuah class turunan menimpa member virtual, member tersebut dipanggil bahkan ketika sebuah instance dari class tersebut diakses sebagai turunan dari base class.

Code berikut memberikan contoh:
DerivedClass B = new DerivedClass();
B.DoWork();  // Calls the new method.

BaseClass A = (BaseClass)B;
A.DoWork();  // Also calls the new method.
Metod dan sifat virtual memungkinkan class turunan untuk memperpanjang base class tanpa perlu menggunakan penerapan base class metode.

Untuk informasi lebih lanjut, lihat Versi dengan Override dan New Keywords. Interface menyediakan cara lain untuk menentukan metod atau seperangkat metod yang penerapannya diserahkan ke class turunan.

  • Hiding Base Class Members with New Members


Jika kita ingin member turunan kita memiliki nama yang sama dengan member di base class, namun kita tidak ingin berpartisipasi dalam virtual invocation, kita dapat menggunakan keyword new. keyword new diletakkan sebelum value type member class yang sedang diganti. Code berikut memberikan contoh:

public class BaseClass
{
    public void DoWork() { WorkField++; }
    public int WorkField;
    public int WorkProperty
    {
        get { return 0; }
    }
}

public class DerivedClass : BaseClass
{
    public new void DoWork() { WorkField++; }
    public new int WorkField;
    public new int WorkProperty
    {
        get { return 0; }
    }
}
Member base class tersembunyi masih dapat diakses dari client code dengan mengirimkan instance dari class turunan ke instance base class. Sebagai contoh:

DerivedClass B = new DerivedClass();
B.DoWork();  // Calls the new method.

BaseClass A = (BaseClass)B;
A.DoWork();  // Calls the old method.

  • Preventing Derived Classes from Overriding Virtual Members Member


Virtual tetap virtual tanpa batas waktu, terlepas dari berapa banyak class yang telah dinyatakan antara member virtual dan class yang awalnya menyatakannya. Jika class A mendeklarasikan member virtual, dan class B berasal dari A, dan class C berasal dari B, class C inheritance member virtual, dan memiliki opsi untuk menggantikannya, terlepas dari apakah class B menyatakan sebuah penyesalan untuk member tersebut. Code berikut memberikan contoh:
public class A
{
    public virtual void DoWork() { }
}
public class B : A
{
    public override void DoWork() { }
}
class turunan bisa menghentikan inheritance virtual dengan menyatakan sebuah penggantian yang disegel. Ini memerlukan keyword yang disegel sebelum mengesampingkan keyword dalam deklarasi member class. Code berikut memberikan contoh:
public class C : B
{
    public sealed override void DoWork() { }
}
Pada contoh sebelumnya, metode DoWork tidak lagi virtual ke class manapun yang berasal dari C. Ini masih virtual untuk contoh C, bahkan jika diputar ke tipe B atau tipe A. Metode yang disegel dapat digantikan oleh class turunan dengan menggunakan keyword new, seperti contoh berikut ini:
public class D : C
{
    public new void DoWork() { }
}
Dalam kasus ini, jika DoWork dipanggil pada D dengan menggunakan variabel type D, maka DoWork yang baru dipanggil. Jika variabel tipe C, B, atau A digunakan untuk mengakses instance D, sebuah panggilan ke DoWork akan mengikuti aturan virtual inheritance, mengarahkan panggilan ke implementasi DoWork di kelas C.

  • Accessing Base Class Virtual Members from Derived Classes Class


Turunan yang telah mengganti atau mengganti metod atau properti dapat mengakses metod atau properti di base class menggunakan base keyword. Code berikut memberikan contoh:
public class Base
{
    public virtual void DoWork() {/*...*/ }
}
public class Derived : Base
{
    public override void DoWork()
    {
        //Perform Derived's work here
        //...
        // Call DoWork on base class
        base.DoWork();
    }
}
Previous
Next Post »