Saat membahas pertanyaan tentang fungsi virtual pada Stack Overflow, saya bertanya-tanya apakah ada penamaan resmi untuk fungsi virtual murni (abstrak) dan non-murni.
Saya selalu mengandalkan wikipedia untuk informasi saya, yang menyatakan itu fungsi virtual murni dan non-murni adalah istilah umum. Sayangnya, artikel tersebut tidak mendukungnya dengan sumber atau referensi.
Mengutip jawaban Jon Skeet untuk balasan saya bahwa murni dan tidak murni adalah istilah umum yang digunakan:
@ Seven: Hmm ... mungkin, tapi saya hanya pernah melihatnya dalam konteks C ++ sebelumnya. Saya menduga siapa pun yang berbicara tentang mereka cenderung memiliki latar belakang C ++ :)
Apakah istilah tersebut berasal dari C ++, atau mereka pertama kali didefinisikan atau diimplementasikan dalam bahasa sebelumnya, dan apakah mereka istilah ilmiah 'resmi'?
MEMPERBARUI:
Frank Shearar membantu memberikan tautan ke deskripsi SIMULA 67 Common Base Language (1970). Bahasa ini tampaknya menjadi bahasa pertama yang memperkenalkan kata kunci OO sebagai kelas , objek , dan juga virtual sebagai konsep formal. Itu tidak mendefinisikan murni / tidak murni atau abstrak , tetapi mendukung konsep .
Siapa yang mendefinisikannya?
sumber
Jawaban:
Nygaard dan Dahl pertama kali menggunakan istilah ini, dalam SIMULA 67 Common Base Language . Lihat di bagian 2.1, misalnya, dan bagian 2.2.3. (Sejauh yang saya tahu paling tidak. Tapi hei, sejauh menyangkut OOP, itu mungkin penggunaan pertama istilah itu.)
sumber
Jadi ... Saya sudah melakukan sedikit riset. Berikut ini adalah sedikit pelajaran sejarah bagi mereka yang tertarik. :) Lewati ke kesimpulan di bagian bawah jika Anda hanya tertarik dengan jawabannya.
1967 :
SIMULA 67 , bahasa pemrograman berorientasi objek pertama mendefinisikan kata kunci sebagai kelas , objek , panggilan dengan referensi , panggilan dengan nilai dan virtual .
Sistem pewarisan SIMULA pada awalnya dikenal dengan nama yang berbeda, gabungan (dan kemudian dikenal sebagai awalan ), merujuk pada fakta bahwa kode supertipe disalin dan 'disatukan' dengan kode subtipe. Kemudian bentuk lain sistem warisan muncul, delegasi , di mana panggilan didelegasikan dengan mengacu pada jenis yang benar.
Virtual kemungkinan besar mengacu pada proses yang perlu dilakukan untuk mengirimkan panggilan ke implementasi yang benar dengan menggunakan tabel metode virtual . Ini virtual dibandingkan dengan implementasi tetap / konkret.
1971 :
Niklaus Wirth, menulis tentang konsep yang didefinisikan sebagai Stepwise Refinement . Ini pada dasarnya menjelaskan cara membagi program dalam solusi parsial yang dapat diperpanjang.
1974 :
Ini adalah kertas paling awal yang saya temukan yang mengandung istilah tipe data abstrak oleh Barbara Liskov .
Makalah ini juga mendefinisikan sebuah cluster operasi yang tampaknya menentukan apa yang sekarang kita kenal sebagai antarmuka .
Terminologi ilmiah yang menarik (makalah dari 1996):
Warisan : mekanisme yang lebih rendah di mana objek atau kelas dapat berbagi perilaku atau data.
Subtyping : mengekspresikan spesialisasi konseptual. Suatu bentuk khusus warisan, juga disebut warisan antarmuka .
Prinsip Abstraksi : Proses pengorganisasian pengetahuan kita tentang domain aplikasi ke dalam peringkat hierarki urutan abstraksi, untuk mendapatkan pemahaman yang lebih baik tentang fenomena yang bersangkutan.
Abstraksi yang diimplementasikan sebagian : abstraksi yang definisinya sengaja dibiarkan tidak lengkap.
Kelas abstrak : Istilah khusus untuk kelas yang diimplementasikan sebagian dalam sistem berorientasi objek.
Warisan nonstrict : Memungkinkan operasi untuk didefinisikan ulang (atau bahkan dihapus) dalam subkelas.
Warisan ketat : Warisan yang kompatibel secara perilaku.
Kesimpulan :
Kelas abstrak adalah istilah paling umum untuk digunakan dalam sistem berorientasi objek. Tampaknya fungsi virtual murni dan non-murni hanya berasal dari C ++. Misalnya, wawancara dengan Stroustrup ini membuatnya seolah-olah dia yang menciptakan istilah-istilah itu. Makalah ilmiah menggunakan terminologi yang lebih umum.
Virtual berasal dari SIMULA, yang menyebabkan penggunaannya menjadi luas, tetapi itu bukan istilah umum. Itu sudah mendefinisikan detail implementasi. Berbicara dalam hal jenis warisan lebih tepat. Non-virtual secara default sesuai dengan warisan ketat secara default, sedangkan virtual secara default sesuai dengan warisan nonstrict .
Adakah yang tertarik untuk menyesuaikan entri wikipedia ? :)
sumber
Dalam C ++, fungsi anggota yang terikat secara dinamis, dan dengan demikian dapat diganti oleh sub-kelas disebut "virtual". Fungsi virtual yang mutlak harus diganti disebut "virtual murni". Perhatikan bahwa fungsi virtual murni mungkin memiliki tubuh, meskipun seringkali tidak. Kelas yang memiliki setidaknya satu fungsi virtual murni disebut "abstrak", dan tidak dapat dipakai, hanya berasal dari.
Saya menduga alasan mengapa fungsi virtual disebut virtual adalah fakta bahwa tidak diketahui fungsi sebenarnya yang akan dipanggil pada waktu kompilasi. Dalam arti tertentu, panggilan fungsi virtual "tidak ada" pada waktu kompilasi.
Saya juga menduga bahwa alasan istilah "abstrak" digunakan untuk kelas dengan fungsi virtual murni adalah bahwa Anda tidak dapat memiliki objek dari kelas itu. Dalam arti tertentu, ini adalah konsep abstrak yang jauh dari dunia benda konkret.
Edit: Bahasa lain.
Sejauh pertanyaan tentang seberapa umum istilah "virtual" itu, inilah dua sen saya. Di Smalltalk semua fungsi menggunakan pengikatan dinamis, jadi semuanya virtual, dan tidak perlu istilah khusus atau kata kunci bahasa. Di Jawa, jika saya tidak salah, kompiler secara otomatis memutuskan apakah pengikatan dinamis harus digunakan, sejauh yang menyangkut programmer tidak ada perbedaan, dan karenanya tidak ada kata kunci "virtual".
Dalam C ++ perbedaan antara virtual dan non-virtual diperlukan, karena terserah kepada programmer untuk memutuskan kapan pengikatan dinamis harus digunakan untuk menghemat overhead ketika itu tidak diperlukan.
sumber
dynamic
- yang merupakan semacam metode virtual yang memperdagangkan ruang untuk waktu: mereka membutuhkan lebih sedikit ruang, dan lebih lambat untuk dieksekusi, daripadavirtual
metode.