Apakah ada bahasa pemrograman berorientasi objek yang tidak didasarkan pada paradigma kelas?
Apakah ada bahasa pemrograman berorientasi objek yang tidak didasarkan pada paradigma kelas?
Jawaban:
Sejauh yang saya tahu, Self adalah bahasa asli yang menemukan paradigma "bebas kelas" berdasarkan prototipe . Ini sudah ada (dalam tahap eksperimental) pada 1980-an dan mendorong penggunaan pola prototipe Smalltalk yang anggun hingga ekstrem, sehingga kelas-kelas dihilangkan sama sekali.
Ini memengaruhi semua bahasa OO "bebas-kelas" lainnya yang saya tahu:
Bahasa seperti JavaScript didasarkan pada prototipe , di mana perilaku digunakan kembali dengan mengkloning objek yang ada. Artikel Wikipedia yang saya tautkan menunjukkan bahwa Lua, ActionScript, dan sejumlah bahasa lain mengikuti paradigma ini.
Bahasa pemrograman berorientasi objek paling populer di dunia tidak memiliki kelas, itu disebut Javascript dan berbasis prototipe: http://en.wikipedia.org/wiki/Prototype-based_programming
Orientasi objek adalah istilah umum untuk beberapa konsep penting yang hanya saling bergantung satu sama lain. Misalnya, pewarisan dapat dideklarasikan berdasarkan kasus per kasus antara instance daripada antar kelas, atau seluruh kelas dapat diwakili oleh prototype
objek konkret , seperti yang ditulis Thomas. Lebih biasa memisahkan deskripsi struktur dari pembuatan instance. Demikian pula, keterlambatan mengikat berarti bahwa objek dengan metode yang sama secara nominal tidak harus melakukan hal yang sama ketika dipanggil, dan bahwa keputusan dibuat saat runtime. Itu juga mungkin dilakukan dengan pendekatan berbasis prototipe. Dan enkapsulasi pada dasarnya sepenuhnya independen dari apakah objek Anda adalah instance dari kelas yang dideklarasikan atau tidak.
Yang mengatakan, sebagian besar bahasa OO tegas di kamp berbasis kelas. Tetapi bahkan kemudian ada idiom yang mengaburkan garis: desain berbasis domain sering mengarah ke sistem di mana identitas objek tertentu jauh lebih penting daripada diagram kelas statis, dan dekorator memungkinkan objek dari kelas atau antarmuka yang sama untuk memiliki sangat perilaku yang berbeda.
Benteng adalah bahasa berorientasi objek yang didasarkan pada ciri-ciri alih-alih kelas. Perbedaannya terutama pada komposisi implementasi. Perilaku objek (definisi metode) masih ditentukan oleh deklarasi pada titik tertentu dalam teks program. Jadi dalam arti itu mirip dengan sistem berbasis kelas.
Ada objek batu (menurut Cardelli, saya pikir), yang murni berbasis objek. Setiap metode adalah anggota instan. Anda membentuk objek baru dengan mengambil konten objek yang ada dan menambahkan, menghapus, atau mengganti beberapa anggotanya. Ini sedikit berbeda dari prototipe, karena objek baru tidak memiliki tautan ke objek lama, hanya beberapa isinya.
IIRC, dimungkinkan untuk memprogram dengan cara yang sama menggunakan Python dan bahasa berorientasi hashtable lainnya: Anda dapat menambahkan fungsi sebagai anggota instance dan kemudian menyebutnya sebagai metode.
Ada, pada revisi 1995, Ada berorientasi objek, tetapi tidak seperti banyak bahasa OO lain, ia tidak menggabungkan jenis dan modul berorientasi objek ke dalam konstruksi tunggal yang disebut "kelas". Daripada mendeklarasikan tipe sebagai "class Foo", dan menempatkan semua deklarasi metode terkait di dalam deklarasi kelas, Anda mendeklarasikan sebuah paket dan mendeklarasikan tipe (sebagai a record
) dan hal-hal lain di dalam paket. Ini bukan "bebas kelas" dalam cara beberapa bahasa yang disebutkan lainnya, itu hanya cara yang sedikit berbeda dalam mengatur berbagai hal.
Fitur berorientasi objek Ada 95 ditambahkan ke versi bahasa 1983 yang ada; itu memperpanjang catatan yang ada dan paket konstruksi untuk mendukung warisan et al.
Io adalah bahasa berorientasi objek berbasis prototipe lain. Ini sebenarnya menarik inspirasi dari beberapa bahasa yang telah disebutkan dalam jawaban lain.
Io adalah bahasa pemrograman berbasis prototipe yang dinamis. Ide-ide dalam Io sebagian besar terinspirasi oleh Smalltalk (semua nilai adalah objek), Self (berbasis prototipe), NewtonScript (pewarisan diferensial), Act1 (aktor dan masa depan untuk konkurensi), Lisp (kode adalah pohon runtime yang dapat diperiksa / dimodifikasi pohon) dan Lua (kecil, dapat disematkan).
Erlang. Dan ya, Erlang adalah bahasa berorientasi objek, karena memenuhi ketiga poin definisi OO.