Perbedaannya adalah antara Apa itu sesuatu, dan Bagaimana sesuatu berperilaku.
Banyak bahasa mencoba menyatukan keduanya, tetapi mereka adalah hal yang sangat berbeda.
Jika Bagaimana Apa, dan Apa Bagaimana ...
Jika semuanya mewarisi object
maka beberapa manfaat terjadi seperti: variabel objek apa pun dapat memiliki nilai apa pun. Tapi itu juga intinya, semuanya harus berperilaku ( bagaimana ) seperti object
, dan terlihat seperti ( apa ) object
.
Tapi:
- Bagaimana jika objek Anda tidak memiliki definisi kesetaraan yang bermakna?
- Bagaimana jika itu tidak memiliki hash yang bermakna?
- Bagaimana jika objek Anda tidak dapat dikloning, tetapi objek bisa?
Entah object
tipe menjadi tidak berguna - karena objek tidak memberikan kesamaan di semua contoh yang mungkin. Atau ada akan ada benda-benda yang telah patah / sepatu bertanduk / definisi absurd beberapa properti yang universal diduga ditemukan di object
mana provies hampir perilaku yang universal kecuali untuk sejumlah gotchas.
Jika Apa yang tidak terikat dengan Bagaimana
Bergantian Anda dapat menyimpan Apa dan Bagaimana . Kemudian beberapa Jenis berbeda (dengan tidak ada kesamaan sama sekali apa ) semua bisa berperilaku dengan cara yang sama seperti yang dilihat dari kolaborator bagaimana . Dalam pengertian ini gagasan tentang Iterator
bukanlah apa yang spesifik , tetapi bagaimana . Khususnya Bagaimana Anda berinteraksi dengan sesuatu ketika Anda belum tahu dengan apa Anda berinteraksi.
Java (dan sejenisnya) memungkinkan pendekatan untuk ini dengan menggunakan antarmuka. Antarmuka dalam hal ini menggambarkan sarana komunikasi, dan secara implisit protokol komunikasi dan tindakan yang diikuti. Apa Apa pun yang menyatakan dirinya sebagai Bagaimana , menyatakan bahwa itu mendukung komunikasi yang relevan dan tindakan yang digariskan oleh protokol. Ini memungkinkan setiap kolaborator untuk bergantung pada Bagaimana dan tidak macet dengan menentukan dengan tepat apa yang dapat digunakan.
C ++ (dan sejenisnya) memungkinkan pendekatan untuk ini dengan mengetik bebek. Templat tidak peduli jika tipe yang berkolaborasi menyatakan bahwa ia mengikuti perilaku, hanya saja dalam konteks kompilasi yang diberikan, bahwa objek dapat berinteraksi dengan cara tertentu. Ini memungkinkan C ++ pointer, dan Object over-riding operator tertentu untuk digunakan oleh kode yang sama. Karena mereka memenuhi daftar periksa untuk dianggap setara.
- mendukung * a, a->, ++ a, dan ++ -> input / penerus iterator
- mendukung * a, a->, ++ a, a ++, --a, dan a-- -> bidirectional iterator
Jenis yang mendasarinya bahkan tidak harus iterasi wadah, bisa apa saja . Selain itu memungkinkan beberapa kolaborator untuk menjadi lebih generik, bayangkan fungsi hanya perlu a++
, iterator dapat memuaskan itu, begitu juga sebuah pointer, sehingga dapat sebuah integer, sehingga dapat mengimplementasikan objek apa pun operator++
.
Spesifikasi Di Bawah dan Di Atas
Masalah dengan kedua pendekatan di bawah dan di atas spesifikasi.
Menggunakan antarmuka membutuhkan objek untuk menyatakan mendukung perilaku yang diberikan, yang juga berarti bahwa pencipta harus menambahkannya sejak awal. Hal ini menyebabkan beberapa Apa yang tidak membuat potongan, karena mereka tidak menyatakannya. Itu juga berarti apa adanya memiliki leluhur yang sama, antarmuka yang mewakili Bagaimana . Lingkaran ini kembali ke masalah awal object
. Hal ini menyebabkan kolaborator terlalu menentukan persyaratan mereka, sementara secara bersamaan menyebabkan beberapa objek menjadi tidak dapat digunakan karena kurangnya deklarasi, atau disembunyikan gotcha karena perilaku yang diharapkan didefinisikan dengan buruk.
Menggunakan templat mengharuskan kolaborator bekerja dengan Apa yang sama sekali tidak dikenal , dan melalui interaksinya ia menentukan Bagaimana . Untuk beberapa hal ini membuat kolaborator menulis lebih sulit, karena ia harus menganalisis Apa untuk primitif komunikasinya (fungsi / bidang / dll) sambil menghindari kesalahan kompilasi, atau setidaknya menunjukkan bagaimana yang diberikan Apa yang tidak cocok dengan persyaratannya untuk Bagaimana . Ini memungkinkan kolaborator untuk meminta minimum absolut dari Apa yang diberikan , memungkinkan rentang terluas apa yang akan digunakan. Sayangnya ini memiliki kelemahan dari memungkinkan penggunaan benda yang tidak masuk akal yang teknis menyediakan komunikasi primitif untuk diberikanCaranya , tapi jangan ikuti protokol tersirat yang memungkinkan segala macam hal buruk terjadi.
Iterator
Dalam hal Iterator
ini, a adalah Bagaimana itu adalah singkatan untuk deskripsi interaksi. Apa pun yang cocok dengan deskripsi itu adalah menurut definisi Iterator
. Mengetahui Bagaimana memungkinkan kita untuk menulis algoritma umum dan memiliki daftar singkat ' Bagaimana diberi spesifik Apa ' yang perlu disediakan untuk membuat algoritma bekerja. Daftar itu adalah fungsi / properti / dll, implementasinya memperhitungkan spesifik Apa yang sedang ditangani oleh algoritma.