Anda di halaman 1dari 8

Polimorfisme (ilmu

komputer)

Dalam bahasa pemrograman dan teori tipe , polimorfisme adalah penyediaan antarmuka
tunggal untuk entitas dari tipe yang berbeda [1] atau penggunaan simbol tunggal untuk
mewakili beberapa tipe yang berbeda. [2]

Kelas utama polimorfisme yang paling umum dikenal adalah:

Polimorfisme ad hoc : mendefinisikan antarmuka umum untuk sekumpulan tipe yang


ditentukan secara sewenang-wenang.

Polimorfisme parametrik : ketika satu atau lebih jenis tidak ditentukan oleh nama tetapi
dengan simbol abstrak yang dapat mewakili jenis apa pun.

Subtipe (juga disebut polimorfisme subtipe atau polimorfisme inklusi ): ketika sebuah nama
menunjukkan instance dari banyak kelas berbeda yang terkait oleh beberapa superkelas
umum. [3]

Sejarah

Ketertarikan pada sistem tipe polimorfik berkembang secara signifikan pada 1960-an,
dengan implementasi praktis mulai muncul pada akhir dekade. Polimorfisme ad hoc dan
polimorfisme parametrik awalnya dijelaskan dalam Christopher Strachey 's Konsep
Fundamental di Bahasa Pemrograman , [4] di mana mereka terdaftar sebagai 'dua kelas utama'
polimorfisme. Polimorfisme ad hoc adalah fitur dari Algol 68 , sedangkan polimorfisme
parametrik adalah fitur inti dari sistem tipe ML .
Dalam makalah tahun 1985, Peter Wegner dan Luca Cardelli memperkenalkan istilah
polimorfisme inklusi untuk memodelkan subtipe dan pewarisan , [2] mengutip Simula sebagai
bahasa pemrograman pertama yang mengimplementasikannya.

Jenis

Polimorfisme ad hoc …

Christopher Strachey memilih istilah polimorfisme ad hoc untuk merujuk pada fungsi
polimorfik yang dapat diterapkan pada argumen dari jenis yang berbeda, tetapi berperilaku
berbeda tergantung pada jenis argumen yang diterapkan (juga dikenal sebagai fungsi
overloading atau operator overloading ). [5] Istilah " ad hoc " dalam konteks ini tidak
dimaksudkan untuk merendahkan; itu hanya merujuk pada fakta bahwa jenis polimorfisme ini
bukan fitur mendasar dari sistem tipe. Dalam contoh Pascal / Delphi di bawah ini, Add
fungsi tampaknya bekerja secara umum pada berbagai jenis ketika melihat pemanggilan,
tetapi dianggap sebagai dua fungsi yang sepenuhnya berbeda oleh kompiler untuk semua
maksud dan tujuan:

program Adhoc ;

fungsi Tambah ( x , y : Integer ) : Integer ;


mulai
Tambah := x + y
akhir ;

fungsi Tambah ( s , t : String ) : String ;


mulai
Tambah := Concat ( s , t )
akhir ;

mulai
Writeln ( Tambah ( 1 , 2 )) ; (*
Mencetak "3" *)
Writeln ( Add ( 'Halo, ' , 'Mamalia!' )) ; (* Mencetak
"Halo, Mamalia!" *)
end .
Dalam bahasa yang diketik secara dinamis , situasinya bisa lebih kompleks karena fungsi
yang benar yang perlu dipanggil mungkin hanya dapat ditentukan pada saat run time.

Konversi tipe implisit juga telah didefinisikan sebagai bentuk polimorfisme, yang disebut
sebagai "polimorfisme paksaan". [2] [6]

Polimorfisme parametrik …

Polimorfisme parametrik memungkinkan fungsi atau tipe data ditulis secara umum, sehingga
dapat menangani nilai secara seragam tanpa bergantung pada tipenya. [7] Polimorfisme
parametrik adalah cara untuk membuat bahasa lebih ekspresif sambil tetap
mempertahankan tipe-keamanan statis penuh .

Konsep polimorfisme parametrik berlaku untuk tipe data dan fungsi . Sebuah fungsi yang
dapat mengevaluasi atau diterapkan pada nilai-nilai dari jenis yang berbeda dikenal sebagai
fungsi polimorfik. Sebuah tipe data yang dapat muncul menjadi tipe umum (misalnya daftar
dengan elemen tipe arbitrer) ditunjuk tipe data polimorfik seperti tipe umum dari mana
spesialisasi tersebut dibuat.

Polimorfisme parametrik ada di mana-mana dalam pemrograman fungsional, yang sering


disebut sebagai "polimorfisme". Contoh berikut di Haskell menunjukkan tipe data daftar
parameter dan dua fungsi polimorfik parametrik pada mereka:

data Daftar a = Nihil | Kontra a ( Daftar a )

panjang :: Daftar a -> Bilangan bulat


panjang Nil = 0
panjang ( Kontra x xs ) = 1 + panjang xs

peta :: ( a -> b ) -> Daftar a -> Daftar b


peta f Nihil = Nihil
peta f ( Kontra x xs ) = Kontra ( f x ) ( peta f xs )

Polimorfisme parametrik juga tersedia dalam beberapa bahasa berorientasi objek. Misalnya,
template dalam C++ dan D, atau dengan nama generik di C#, Delphi dan Java:

kelas Daftar < T > {


kelas Node < T > {
T elem ;
Simpul < T > berikutnya ;
}
Simpul < T > kepala ;
int panjang () { ... }
}

Daftar < B > peta ( Func < A , B > f , daftar < A > xs ) {
...
}

John C. Reynolds (dan kemudian Jean-Yves Girard ) secara resmi mengembangkan gagasan
polimorfisme ini sebagai perluasan dari kalkulus lambda (disebut kalkulus lambda polimorfik
atau Sistem F ). Setiap fungsi polimorfik parametrik tentu dibatasi dalam apa yang dapat
dilakukannya, bekerja pada bentuk data alih-alih nilainya, yang mengarah ke konsep
parametrik .

mengetik sub …

Beberapa bahasa menggunakan gagasan subtipe (juga disebut polimorfisme subtipe atau
polimorfisme inklusi ) untuk membatasi rentang tipe yang dapat digunakan dalam kasus
polimorfisme tertentu. Dalam bahasa-bahasa ini, subtipe memungkinkan suatu fungsi ditulis
untuk mengambil objek bertipe T tertentu , tetapi juga berfungsi dengan benar, jika melewati
objek yang termasuk dalam tipe S yang merupakan subtipe T (menurut prinsip substitusi
Liskov ) . Relasi tipe ini terkadang ditulis S  <:  T . Sebaliknya, T dikatakan supertipe dari S—
ditulis T  :>  S . Polimorfisme subtipe biasanya diselesaikan secara dinamis (lihat di bawah).

Dalam contoh berikut kita membuat subtipe hewan kucing dan anjing. Prosedur
letsHear() menerima hewan, tetapi juga akan bekerja dengan benar jika subtipe
diteruskan ke sana:

kelas abstrak Hewan {


abstract String talk ();
}

class Cat extends Animal {


String talk () {
return "Meow!" ;
}
}
class Dog extends Animal {
String talk () {
return "Guk!" ;
}
}

static kekosongan letsHear ( akhir Animal a ) {


println ( a . bicara ());
}

static void main ( String [] args ) {


letsHear ( Cat baru ()); letHear ( Anjing baru ()); }

Dalam contoh lain, jika Number , Rational , dan Integer bertipe sedemikian sehingga Number
 :>  Rational dan Number  :>  Integer , fungsi yang ditulis untuk mengambil Number akan
bekerja sama baiknya ketika melewati Integer atau Rational seperti ketika melewati Number .
Jenis objek yang sebenarnya dapat disembunyikan dari klien ke dalam kotak hitam , dan
diakses melalui identitas objek . Faktanya, jika tipe Number adalah abstract , Anda bahkan
tidak mungkin mendapatkan objek yangtipe yang paling diturunkan adalah Number (lihat tipe
data abstrak , kelas abstrak ). Jenis hierarki tipe khusus ini dikenal—khususnya dalam
konteks bahasa pemrograman Skema— sebagai menara numerik , dan biasanya berisi lebih
banyak tipe.

Bahasa pemrograman berorientasi objek menawarkan polimorfisme subtipe menggunakan


subkelas (juga dikenal sebagai pewarisan ). Dalam implementasi tipikal, setiap kelas berisi
apa yang disebut tabel virtual —tabel fungsi yang mengimplementasikan bagian polimorfik
dari antarmuka kelas—dan setiap objek berisi penunjuk ke "vtable" kelasnya, yang kemudian
dikonsultasikan setiap kali polimorfik metode disebut. Mekanisme ini adalah contoh dari:

late binding , karena panggilan fungsi virtual tidak terikat hingga waktu pemanggilan;

pengiriman tunggal (yaitu polimorfisme argumen tunggal), karena panggilan fungsi virtual
terikat hanya dengan melihat melalui vtable yang disediakan oleh argumen pertama
( this objek), sehingga tipe runtime dari argumen lain sama sekali tidak relevan.

Hal yang sama berlaku untuk sebagian besar sistem objek populer lainnya. Namun,
beberapa, seperti Common Lisp Object System , menyediakan beberapa dispatch , di mana
pemanggilan metode bersifat polimorfik dalam semua argumen.
Interaksi antara polimorfisme parametrik dan subtipe mengarah pada konsep varians dan
kuantifikasi terbatas .

Polimorfisme baris …

Polimorfisme baris [8] adalah konsep yang serupa, tetapi berbeda dari subtipe. Ini berkaitan
dengan tipe struktural . Ini memungkinkan penggunaan semua nilai yang tipenya memiliki
properti tertentu, tanpa kehilangan informasi tipe yang tersisa.

Politipisme …

Konsep terkait adalah polytypism (atau generikitas tipe data ). Fungsi politipe lebih umum
daripada polimorfik, dan dalam fungsi seperti itu, "walaupun seseorang dapat menyediakan
kasus ad hoc tetap untuk tipe data tertentu, kombinator ad hoc tidak ada". [9]

Aspek implementasi

Polimorfisme statis dan dinamis …

Polimorfisme dapat dibedakan ketika implementasi dipilih: statis (pada waktu kompilasi)
atau dinamis (pada waktu berjalan, biasanya melalui fungsi virtual ). Ini masing-masing
dikenal sebagai pengiriman statis dan pengiriman dinamis , dan bentuk-bentuk polimorfisme
yang sesuai disebut polimorfisme statis dan polimorfisme dinamis .

Polimorfisme statis dieksekusi lebih cepat, karena tidak ada overhead pengiriman dinamis,
tetapi memerlukan dukungan kompiler tambahan. Selanjutnya, polimorfisme statis
memungkinkan analisis statis yang lebih besar oleh kompiler (terutama untuk optimasi), alat
analisis kode sumber, dan pembaca manusia (programmer). Polimorfisme dinamis lebih
fleksibel tetapi lebih lambat—misalnya, polimorfisme dinamis memungkinkan pengetikan
bebek, dan pustaka yang terhubung secara dinamis dapat beroperasi pada objek tanpa
mengetahui tipe lengkapnya.

Polimorfisme statis biasanya terjadi pada polimorfisme ad hoc dan polimorfisme parametrik,
sedangkan polimorfisme dinamis biasa terjadi pada polimorfisme subtipe. Namun,
dimungkinkan untuk mencapai polimorfisme statis dengan subtipe melalui penggunaan
metaprogramming template yang lebih canggih , yaitu pola template yang berulang secara
aneh .
Saat polimorfisme diekspos melalui library , polimorfisme statis menjadi tidak mungkin untuk
library dinamis karena tidak ada cara untuk mengetahui tipe parameter saat objek bersama
dibuat. Sementara bahasa seperti C++ dan Rust menggunakan template monomorfik, bahasa
pemrograman Swift menggunakan pengiriman dinamis secara ekstensif untuk membangun
antarmuka biner aplikasi untuk pustaka ini secara default. Akibatnya, lebih banyak kode
dapat dibagikan untuk ukuran sistem yang lebih kecil dengan biaya overhead runtime. [10]

Lihat juga

Pengetikan bebek untuk polimorfisme tanpa tipe (statis)

Kode polimorfik (terminologi virus komputer)

Sistem F untuk kalkulus lambda dengan polimorfisme parametrik.

Ketik kelas

Teori tipe

Warisan virtual

Referensi

1. Bjarne Stroustrup (19 Februari 2007). "Glosarium C++ Bjarne Stroustrup" (http://www.stroustrup.com/
glossary.html#Gpolymorphism) . "polimorfisme – menyediakan antarmuka tunggal untuk entitas
dari jenis yang berbeda." (http://www.stroustrup.com/glossary.html#Gpolymorphism) ""

2. Cardelli, Luca ; Wegner, Peter (Desember 1985). "Pada pemahaman tipe, abstraksi data, dan
polimorfisme" (http://lucacardelli.name/Papers/OnUnderstanding.A4.pdf) (PDF) . Survei Komputasi
ACM . 17 (4): 471–523. CiteSeerX  10.1.1.117.695 (https://citeseerx.ist.psu.edu/viewdoc/summary?d
oi=10.1.1.117.695) . doi : 10.1145/6041.6042 (https://doi.org/10.1145%2F6041.6042) . ISSN
 0360-0300 (https://www.worldcat.org/issn/0360-0300) .: "Tipe polimorfik adalah tipe yang
operasinya dapat diterapkan pada nilai lebih dari satu tipe."

3. Booch, dkk 2007 Analisis dan Desain Berorientasi Objek dengan Aplikasi. Addison-Wesley.

4. Strachey, Christopher (2000). "Konsep Dasar dalam Bahasa Pemrograman". Komputasi Orde Tinggi
dan Simbolik . 13 (1/2): 11–49. CiteSeerX  10.1.1.332.3161 (https://citeseerx.ist.psu.edu/viewdoc/su
mmary?doi=10.1.1.332.3161) . doi : 10.1023/A:1010000313106 (https://doi.org/10.1023%2FA%3A
1010000313106) . ISSN  1573-0557 (https://www.worldcat.org/issn/1573-0557) .

5. Christopher Strachey. Konsep Dasar dalam Bahasa Pemrograman (https://web.archive.org/web/2017


0812012310/http://www.itu.dk/courses/BPRD/E2009/fundamental-1967.pdf) (PDF) . www.itu.dk .
Penerbit Akademik Kluwer. Diarsipkan dari versi asli (http://www.itu.dk/courses/BPRD/E2009/funda
mental-1967.pdf) (PDF) pada 12-08-2017 . Diakses pada 10-12-2012 .
. Allen B. Tucker (28 Juni 2004). Buku Pegangan Ilmu Komputer, Edisi Kedua (https://books.google.co
m/books?id=9IFMCsQJyscC&pg=SA91-PA5) . Taylor & Fransiskus. hal.91–. ISBN 978-1-58488-360-
9.

7. Pierce, BC 2002 Jenis dan Bahasa Pemrograman. MIT Pers.

. Tongkat, Mitchell (Juni 1989). "Ketik inferensi untuk rangkaian catatan dan pewarisan berganda".
Prosiding. Simposium Tahunan Keempat tentang Logika dalam Ilmu Komputer . hal.92–97. doi :
10.1109/LICS.1989.39162 (https://doi.org/10.1109%2FLICS.1989.39162) .

9. Ralf Lammel dan Joost Visser, "Typed Combinators for Generic Traversal", dalam Aspek Praktis dari
Bahasa Deklaratif: Simposium Internasional ke-4 (2002), hlm. 153.

10. Beingesner, Alexis. "Bagaimana Swift Mencapai Penautan Dinamis Di Mana Karat Tidak Bisa" (https://
gankra.github.io/blah/swift-abi/) .

Tautan eksternal

C++ contoh polimorfisme (http://www.cplusplus.com/doc/tutorial/polymorphism/)

Objek dan Polimorfisme (Prolog Visual) (http://wiki.visual-prolog.com/index.php?title=Obje


cts_and_Polymorphism)

Diperoleh dari "


https://en.wikipedia.org/w/index.php?
title=Polymorphism_(computer_science)&oldid=1
024134632 "

Terakhir diedit 21 hari yang lalu oleh Tea2min

Konten tersedia di bawah CC BY-SA 3.0 kecuali


dinyatakan lain.

Anda mungkin juga menyukai