Salah satu bentuk dari polimorfisme statis adalah parametrik polimorfisme.
Berbeda dengan ad-hoc polimorfisme yang menggunakan metode overload, parametrik
polimorfisme dapat menyederhanakan metode overload sehingga menjadi lebih efektif.
Di dalam bahasa pemrograman berorientasi objek, polimorfisme parametrik
adalah cara untuk membuat bahasa yang lebih ekspresif, sambil tetap mempertahankan
type-safety statis penuh. Menggunakan polimorfisme parametrik, fungsi atau tipe data
dapat ditulis secara umum sehingga dapat menangani nilai secara identik tanpa
tergantung pada jenisnya. Polimorfisme parametrik menggunakan konsep yang dikenal
dengan nama generik.
C# generik dan C++ template keduanya adalah fitur bahasa yang menyediakan
dukungan untuk jenis parametrik. Namun, ada banyak perbedaan diantara keduanya.
Pada tingkat sintaks, pendekatan C# generik lebih sederhana untuk jenis parameterized
tanpa kompleksitas seperti yang ada pada C++ template. Selain itu, C# tidak berusaha
untuk menyediakan semua fungsionalitas seperti yang C++ template sediakan. Pada
tingkat implementasi, perbedaan utamanya bahwa C# generik melakukan substitusi pada
tipe dalam runtime dan informasi jenis generik yang disiapkan untuk objek yang dipakai.
Berikut perbedaan antara C# generik dengan C++ templates:
- C# generik tidak memberikan kadar fleksibilitas yang sama sebagai C++ template.
- C# generik tidak mengizinkan parameter non-jenis template, seperti template C
{}.
- C# generik tidak mendukung spesialisasi eksplisit; yaitu, implementasi kustom
dari template untuk jenis tertentu.
- C# generik tidak mendukung spesialisasi parsial: penerapan kustom untuk subset
jenis argumen.
- C# generik tidak mengizinkan jenis parameter untuk digunakan sebagai kelas
dasar untuk jenis generik.
- C# generik tidak mengizinkan jenis parameter untuk memiliki jenis default.
- Dalam C#, jenis generik parameter tidak bisa menjadi generik sendiri, meskipun
dibangun jenis yang dapat digunakan sebagai generik.
C++ mengizinkan kode yang mungkin tidak valid untuk semua jenis parameter
dalam template, yang kemudian diperiksa untuk jenis tertentu yang digunakan sebagai
tipe parameter. C# memerlukan kode di dalam kelas untuk ditulis sedemikian rupa
sehingga akan bekerja dengan jenis apapun yang memenuhi konstrain.
Class dan Metode Generik.
Konsep generik dapat diberlakukan dibanyak tempat, seperti: metode, class,
interface, dan delegate. Berangkat dari konsep metode overload, generik dapat
melakukan subtitusi pada tipe data sehingga dapat dideklarasikan berbeda-beda sesuai
kebutuhan. Perhatikan contoh berikut:
Pada contoh diatas, terdapat tiga buah metode overload dengan tipe parameter dan
kembalian nilai yang berbeda, tetapi memiliki isi konten yang identik. Metode overload
yang identik seperti ini dapat dilakukan berulang-ulang. Jika jumlah parameter dan
konten yang berada pada tubuh metode identik sama, maka konsep generik dapat
diberlakukan. Pada konsep dasarnya, generik akan mengganti semua tipe dasar yang ada
didalam metode dengan karakter T. dan dalam penulisan kodenya nanti, T akan diganti
oleh tipe data apapun sesuai dengan kondisi yang berlaku. Pendefinisian tipe pada generik
diberikan didalam tanda kurung sudut "<>". Perhatikan metode yang sudah dirubah
menjadi generik.
Metode yang telah dirubah menjadi generik dapat dipanggil berulang-ulang dengan tipe
data yang berbeda-beda. Programmer bisa mendapatkan keuntungan dalam segi
penulisan kode hingga penggunaan kode bersama-sama.
Konstrain dalam Generik.
Konstrain memberikan informasi kepada kompilator tentang kemampuan jenis
argumen yang harus memiliki. Tanpa konstrain, jenis argumen bisa menjadi jenis apapun.
Kompiler hanya dapat mengasumsikan anggota-anggota yang ada pada System.Object,
yang merupakan kelas dasar untuk setiap jenis pada dotNET. Untuk informasi lebih
lanjut, tentang mengapa menggunakan konstrain. Jika kode pengguna mencoba untuk
melakukan instansi pada kelas dengan menggunakan jenis yang tidak diizinkan oleh
konstrain, hasilnya adalah compile-time-error. Konstrain ditentukan dengan
menggunakan kata kunci kontekstual. Berikut daftar tujuh jenis konstrain yang dapat
digunakan sebagai opsional:

Beberapa konstrain yang saling eksklusif. Semua jenis nilai harus memiliki konstruktor
parameterless (default konstruktor) yang dapat diakses. Batasan struct menyiratkan
konstrain new() dan konstrain new() tidak dapat dikombinasikan dengan konstrain struct.
Batasan yang tidak dikelola menyiratkan batasan struct. konstrain unmanaged tidak dapat
digabungkan dengan konstrain struct atau new(). Berikut contoh pembuatan class generik
dengan menggunakan konstrain.
Dengan membatasi jenis parameter, Programmer dapat meningkatkan jumlah
operasi yang diijinkan dan pemanggilan metode yang didukung oleh jenis konstrain dan
semua jenis dalam hirarki pewarisan. Ketika merancang kelas generik atau metode
generik, jika akan melakukan operasi apapun pada anggota generik di luar tugas
sederhana atau memanggil metode apapun yang tidak didukung oleh System.Object,
maka harus menerapkan konstrain untuk jenis parameter.
Penggunaan generic akan dicontohkan pada program dibawah ini. Program
tersebut akan dibuat dua class model yang berelasi pewarisan. Terdapat satu class yang
akan memproses CRUD, dimana class tersebut dibuat generik. Perhatikan contoh
program berikut.
Pada program diatas class ProductionProgress dibuat generik dengan class model Product
sebagai konstrain. Sehingga class ProductionProgress ketika diinstasikan, maka objeknya
dapat dibuat menjadi semua class-class yang mendapat warisan dari class model Product.
Comments
Post a Comment