Saya masih bertahun-tahun lagi untuk sepenuhnya memahami perbedaan antara kelas abstrak dan antarmuka. Setiap kali saya pikir saya memahami konsep dasar, saya mencari stackexchange dan saya mundur dua langkah. Tetapi beberapa pemikiran tentang topik dan pertanyaan OP:
Pertama:
Ada dua penjelasan umum antarmuka:
Antarmuka adalah daftar metode dan properti yang dapat diterapkan oleh setiap kelas, dan dengan mengimplementasikan antarmuka, kelas menjamin metode tersebut (dan tanda tangannya) dan properti tersebut (dan tipenya) akan tersedia ketika "berinteraksi" dengan kelas itu atau sebuah objek dari kelas itu. Antarmuka adalah kontrak.
Antarmuka adalah kelas abstrak yang tidak / tidak bisa melakukan apa pun. Mereka berguna karena Anda dapat menerapkan lebih dari satu, tidak seperti kelas induk yang berarti. Seperti, saya bisa menjadi objek kelas BananaBread, dan mewarisi dari BaseBread, tetapi itu tidak berarti saya tidak bisa juga mengimplementasikan antarmuka IWithNuts dan ITastesYummy. Saya bahkan bisa mengimplementasikan antarmuka IDoesTheDishes, karena saya bukan hanya roti, tahu?
Ada dua penjelasan umum tentang kelas abstrak:
Kelas abstrak, yah, adalah hal yang tidak bisa dilakukan oleh hal itu. Ini seperti, intinya, sama sekali bukan hal yang nyata. Tunggu, ini akan membantu. Kapal adalah kelas abstrak, tetapi Playboy Yacht yang seksi akan menjadi sub kelas dari BaseBoat.
Saya membaca buku tentang kelas abstrak, dan mungkin Anda harus membaca buku itu, karena Anda mungkin tidak mengerti dan akan melakukannya dengan salah jika Anda belum membaca buku itu.
Ngomong-ngomong, buku Citers selalu tampak mengesankan, walaupun aku masih berjalan pergi dengan bingung.
Kedua:
Pada SO, seseorang menanyakan versi sederhana dari pertanyaan ini, klasik, "mengapa menggunakan antarmuka? Apa bedanya? Apa yang saya lewatkan?" Dan satu jawaban menggunakan pilot angkatan udara sebagai contoh sederhana. Itu tidak cukup mendarat, tetapi memicu beberapa komentar yang bagus, salah satunya menyebutkan antarmuka IFlyable memiliki metode seperti takeOff, pilotEject, dll. Dan ini benar-benar diklik bagi saya sebagai contoh dunia nyata mengapa antarmuka tidak hanya berguna, tetapi sangat penting. Antarmuka membuat objek / kelas menjadi intuitif, atau paling tidak memberikan pengertian bahwa itu objek. Antarmuka bukan untuk kepentingan objek atau data, tetapi untuk sesuatu yang perlu berinteraksi dengan objek itu. Buah klasik-> Apple-> Fuji atau Shape-> Triangle-> Contoh-contoh pewarisan sama sisi adalah model yang bagus untuk memahami taksonomi objek yang diberikan berdasarkan keturunannya. Ini memberi tahu konsumen dan prosesor tentang kualitas umum, perilaku, apakah objek itu sekelompok hal, akan menyiram sistem Anda jika Anda meletakkannya di tempat yang salah, atau menjelaskan data sensorik, konektor ke toko data tertentu, atau data keuangan diperlukan untuk membuat daftar gaji.
Objek Plane tertentu mungkin atau mungkin tidak memiliki metode untuk pendaratan darurat, tapi saya akan marah jika saya menganggap daruratnya. karena mereka mengira semuanya sama saja. Sama seperti bagaimana saya akan frustrasi jika setiap produsen sekrup memiliki interpretasi yang benar tentang fasty tighty atau jika TV saya tidak memiliki tombol kenaikan volume di atas tombol penurunan volume.
Kelas abstrak adalah model yang menetapkan apa yang harus dimiliki objek turunan apa pun untuk dikualifikasikan sebagai kelas itu. Jika Anda tidak memiliki semua kualitas bebek, tidak masalah bahwa Anda memiliki antarmuka IQuack diimplementasikan, Anda hanya seekor penguin aneh. Antarmuka adalah hal-hal yang masuk akal bahkan ketika Anda tidak bisa memastikan hal lain. Jeff Goldblum dan Starbuck sama-sama dapat menerbangkan pesawat ruang angkasa alien karena antarmuka yang mirip.
Ketiga:
Saya setuju dengan rekan kerja Anda, karena kadang-kadang Anda perlu menerapkan metode tertentu di awal. Jika Anda membuat ORM Rekaman Aktif, ini membutuhkan metode penyimpanan. Ini tidak sampai ke subkelas yang bisa dipakai. Dan jika antarmuka ICRUD cukup portabel untuk tidak secara eksklusif digabungkan ke satu kelas abstrak, itu dapat diimplementasikan oleh kelas lain untuk membuatnya dapat diandalkan dan intuitif bagi siapa pun yang sudah akrab dengan salah satu kelas turunan dari kelas abstrak itu.
Di sisi lain, ada contoh yang bagus sebelumnya ketika tidak melompat untuk mengikat antarmuka ke kelas abstrak, karena tidak semua tipe daftar akan (atau seharusnya) mengimplementasikan antarmuka antrian. Anda mengatakan skenario ini terjadi separuh waktu, yang berarti Anda dan rekan kerja Anda sama-sama salah separuh waktu, dan dengan demikian hal terbaik untuk dilakukan adalah berdebat, berdebat, mempertimbangkan, dan jika ternyata benar, akui dan terima sambungan tersebut. . Tetapi jangan menjadi pengembang yang mengikuti filosofi bahkan ketika itu bukan yang terbaik untuk pekerjaan yang ada.