tl; dr: Anda dapat memiliki warisan tanpa OO, Anda dapat memiliki enkapsulasi tanpa OO, Anda dapat memiliki polimorfisme tanpa OO, Anda bahkan dapat memiliki ketiganya sekaligus tanpa OO. Di flipside, Anda dapat memiliki OO tanpa warisan. Plus, ada berbagai jenis enkapsulasi (berorientasi ADT dan OO), TKI tidak semua enkapsulasi adalah OO.
Versi panjang:
Istilah "Pemrograman Berorientasi Objek" diciptakan oleh Alan Kay, jadi dia harus memutuskan apa artinya. Dan dia mendefinisikannya seperti ini :
OOP bagi saya hanya berarti pengiriman pesan, penyimpanan lokal dan perlindungan dan menyembunyikan proses negara, dan sangat mengikat semua hal.
Dari segi implementasi, olahpesan adalah panggilan prosedur yang terikat akhir, dan jika panggilan prosedur terlambat, maka Anda tidak dapat mengetahui pada waktu desain apa yang akan Anda panggil, sehingga Anda tidak dapat membuat asumsi tentang representasi konkret negara. Jadi, sebenarnya ini tentang pesan, keterlambatan mengikat adalah implementasi dari pesan dan enkapsulasi adalah konsekuensi dari itu.
Dia kemudian mengklarifikasi bahwa " Gagasan besar adalah 'pesan' ", dan menyesal telah menyebutnya "berorientasi objek" daripada "berorientasi pesan", karena istilah "berorientasi objek" menempatkan fokus pada hal yang tidak penting (objek ) dan mengalihkan perhatian dari apa yang benar-benar penting (olahpesan):
Hanya pengingat lembut bahwa saya bersusah payah di OOPSLA terakhir untuk mencoba mengingatkan semua orang bahwa Smalltalk bukan hanya BUKAN sintaks atau perpustakaan kelas, bahkan bukan tentang kelas. Saya minta maaf karena saya telah lama menciptakan istilah "objek" untuk topik ini karena itu membuat banyak orang untuk fokus pada ide yang lebih rendah.
Gagasan besarnya adalah "pesan" - itulah inti dari Smalltalk / Squeak (dan itu adalah sesuatu yang tidak pernah sepenuhnya selesai dalam fase Xerox PARC kami). Orang Jepang memiliki kata kecil - ma - untuk "apa yang ada di antara" - mungkin padanan bahasa Inggris terdekat adalah "pengantara". Kunci dalam membuat sistem yang hebat dan dapat ditumbuhkan jauh lebih banyak untuk merancang bagaimana modul-modulnya berkomunikasi daripada apa sifat dan perilaku internal mereka. Pikirkan internet - untuk hidup, itu (a) harus memungkinkan berbagai jenis ide dan realisasi yang melampaui standar tunggal dan (b) untuk memungkinkan berbagai tingkat interoperabilitas yang aman antara ide-ide ini.
(Tentu saja, hari ini, kebanyakan orang bahkan tidak fokus pada objek tetapi pada kelas, yang bahkan lebih salah.)
Pesan adalah hal mendasar bagi OO, baik sebagai metafora maupun sebagai mekanisme.
Jika Anda mengirim pesan kepada seseorang, Anda tidak tahu apa yang mereka lakukan dengannya. Satu- satunya hal yang dapat Anda amati, adalah respons mereka. Anda tidak tahu apakah mereka memproses pesan itu sendiri (yaitu jika objek memiliki metode), jika mereka meneruskan pesan tersebut ke orang lain (delegasi / proxy), jika mereka memahaminya. Itulah enkapsulasi tentang semua, itulah tujuan dari OO. Anda bahkan tidak dapat membedakan proksi dari yang asli, asalkan merespon seperti yang Anda harapkan.
Istilah yang lebih "modern" untuk "pengiriman pesan" adalah "metode pengiriman dinamis" atau "panggilan metode virtual", tetapi itu kehilangan metafora dan berfokus pada mekanisme.
Poin-poin serupa juga dibuat dalam On Understanding Data Abstraction, ditinjau kembali oleh William R. Cook dan juga Proposal untuk Definisi Modern "Obyek" dan "Berorientasi Objek" .
Pengiriman operasi yang dinamis adalah karakteristik penting dari objek. Ini berarti bahwa operasi yang akan dipanggil adalah properti dinamis dari objek itu sendiri. Operasi tidak dapat diidentifikasi secara statis, dan secara umum tidak ada cara tepat untuk operasi apa yang akan dijalankan sebagai tanggapan terhadap permintaan yang diberikan, kecuali dengan menjalankannya. Ini persis sama dengan fungsi kelas satu, yang selalu dikirim secara dinamis.
Di Smalltalk-72, bahkan tidak ada benda! Ada hanya aliran pesan yang mendapat diurai, ditulis ulang dan dialihkan. Pertama datang metode (cara standar untuk mengurai dan mengubah rute aliran pesan), kemudian datang objek (pengelompokan metode yang berbagi beberapa keadaan pribadi). Warisan datang jauh kemudian, dan kelas hanya diperkenalkan sebagai cara untuk mendukung warisan. Seandainya kelompok riset Kay sudah tahu tentang prototipe, mereka mungkin tidak akan pernah memperkenalkan kelas sejak awal.
Setiap programmer harus membaca Tentang Memahami Abstraksi Data, Revisited . Ini menjelaskan secara rinci apa perbedaan sebenarnya antara Objek dan Tipe Data Abstrak. Dia memberikan contoh menggunakan Java, dan yang sangat relevan dengan pertanyaan ini, karena di kedua contoh ADT dan contoh Object ia menggunakan pewarisan, enkapsulasi dan polimorfisme, tetapi hanya satu contoh adalah object-oriented! Dengan kata lain: Anda dapat memiliki warisan, enkapsulasi, dan polimorfisme, Anda bahkan dapat memiliki ketiganya sekaligus dan masih belum memiliki OO.
Di sisi lain, Anda dapat memiliki OO tanpa warisan. Seperti yang saya sebutkan di atas: versi asli Smalltalk (bahasa yang dirancang oleh Alan Kay, penemu istilah "Pemrograman Berorientasi Objek") tidak memiliki warisan.
Terakhir, tetapi tentu tidak kalah pentingnya, The Treaty of Orlando membahas delegasi sebagai alternatif pewarisan dan bagaimana berbagai bentuk pendelegasian dan pewarisan mengarah pada titik desain berbeda dalam ruang desain bahasa yang berorientasi objek. (Perhatikan bahwa sebenarnya bahkan dalam bahasa yang mendukung warisan, seperti Java, orang sebenarnya diajarkan untuk menghindarinya, sekali lagi menunjukkan bahwa itu tidak perlu untuk OO.)