Saya tahu sintaksnya, aturan diterapkan ke kelas abstrak dan saya ingin tahu penggunaan kelas abstrak
Kelas abstrak tidak bisa dipakai secara langsung tetapi bisa diperpanjang oleh kelas lain
Apa keuntungan melakukan hal itu?
Apa bedanya dengan Interface?
Saya tahu bahwa satu kelas dapat mengimplementasikan banyak antarmuka tetapi hanya dapat memperluas satu kelas abstrak. Apakah itu hanya perbedaan antara antarmuka dan kelas abstrak?
Saya sadar tentang penggunaan Antarmuka. Saya telah mempelajari hal itu dari model delegasi Acara AWT di Jawa.
Dalam situasi apa saya harus mendeklarasikan kelas sebagai kelas abstrak? Apa manfaatnya?
java
object-oriented
abstract-class
Vaibhav Jani
sumber
sumber
Jawaban:
Ini jawabannya melakukan pekerjaan yang baik menjelaskan perbedaan antara kelas abstrak dan antarmuka, tetapi tidak menjawab mengapa Anda harus menyatakan satu.
Dari sudut pandang teknis murni, tidak pernah ada persyaratan untuk menyatakan kelas sebagai abstrak.
Pertimbangkan tiga kelas berikut:
Anda tidak harus membuat kelas database abstrak, meskipun ada masalah yang jelas dengan implementasinya: Ketika Anda menulis program ini, Anda bisa mengetik
new Database()
dan itu akan valid, tetapi itu tidak akan pernah berhasil.Apapun, Anda masih akan mendapatkan polimorfisme, sehingga selama program Anda hanya membuat
SqlDatabase
danOracleDatabase
contoh, Anda dapat menulis metode seperti:Kelas abstrak memperbaiki situasi dengan mencegah pengembang membuat instance kelas dasar, karena pengembang telah menandainya memiliki fungsi yang hilang . Ini juga menyediakan keamanan waktu kompilasi sehingga Anda dapat memastikan bahwa setiap kelas yang memperluas kelas abstrak Anda menyediakan fungsionalitas minimum yang sederhana untuk bekerja, dan Anda tidak perlu khawatir tentang menempatkan metode rintisan (seperti yang di atas) yang dimiliki oleh pewaris. untuk mengetahui secara ajaib bahwa mereka harus mengganti metode untuk membuatnya berfungsi.
Antarmuka adalah topik yang benar-benar terpisah. Antarmuka memungkinkan Anda menggambarkan operasi apa yang dapat dilakukan pada objek. Anda biasanya akan menggunakan antarmuka saat menulis metode, komponen, dll. Yang menggunakan layanan dari komponen lain, objek, tetapi Anda tidak peduli apa jenis objek yang sebenarnya Anda dapatkan dari layanan tersebut.
Pertimbangkan metode berikut:
Anda tidak peduli apakah
database
objek tersebut diwarisi dari objek tertentu, Anda hanya peduli bahwa ia memilikiaddProduct
metode. Jadi dalam hal ini, antarmuka lebih cocok daripada membuat semua kelas Anda mewarisi dari kelas dasar yang sama.Terkadang kombinasi keduanya bekerja dengan sangat baik. Sebagai contoh:
Perhatikan bagaimana beberapa database mewarisi dari RemoteDatabase untuk berbagi beberapa fungsi (seperti menghubungkan sebelum menulis baris), tetapi FileDatabase adalah kelas terpisah yang hanya mengimplementasikan
IProductDatabase
.sumber
Kesamaan
Kelas dan antarmuka abstrak diperlukan untuk abstraksi. Mereka tidak dapat dipakai dengan yang baru , tetapi mungkin untuk diselesaikan dalam inversi wadah kontrol atau melalui pola pabrik.
Perbedaan
Antarmuka
Kelas abstrak
Sebenarnya mudah untuk menemukan jawabannya dengan kueri google sederhana .
sumber
Di kelas abstrak, Anda bisa mengimplementasikan beberapa metode, dan membiarkan (memaksa) sisanya untuk diimplementasikan oleh kelas yang diperluas. Anda tidak dapat menerapkan metode dalam suatu antarmuka. Anda tidak bisa memaksa siapa pun untuk mengesampingkan apa pun ketika memperluas kelas biasa. Dengan kelas abstrak, Anda bisa.
sumber
Kelas abstrak untuk "adalah" hubungan dan antarmuka untuk "bisa melakukan".
Kelas abstrak memungkinkan Anda menambahkan perilaku dasar sehingga programmer tidak perlu membuat kode segalanya, sambil tetap memaksa mereka untuk mengikuti desain Anda.
sumber
Selain detail teknis yang mendalam - seperti implementasi beberapa metode untuk kelas abstrak, dll, artinya seperti ini:
Antarmuka mendefinisikan kemampuan umum - IEnumerable mendefinisikan, bahwa kelas yang mengimplementasikan antarmuka ini dapat disebutkan. Itu tidak mengatakan apa-apa tentang kelas itu sendiri.
Abstrak (atau basis) kelas mendefinisikan perilaku - WebRequest mendefinisikan perilaku umum semua kelas anak seperti HttpWebRequest, dll. Ini mendefinisikan makna inti dari kelas dan tujuan sebenarnya - untuk mengakses sumber daya web.
sumber
Entri Wikipedia .
Perbedaan utama antara antarmuka dan kelas abstrak adalah bahwa kelas abstrak dapat menyediakan metode yang diimplementasikan. Dengan antarmuka, Anda hanya dapat mendeklarasikan metode, tulis tanda tangannya. Berikut ini adalah contoh dari kelas yang memperluas kelas abstrak yang mengimplementasikan dua antarmuka: (java)
Dalam contoh ini, MyAbstractClass menyediakan metode publik yang mencetak ketiga nilai. Di ImpClass Anda perlu mengimplementasikan getValue1, dan getValue2 masing-masing dari MyInterface1 dan MyInterface2 dan getValue3 dari kelas abstrak.
Voa.
Ada lebih banyak aspek (antarmuka: hanya metode publik, kelas abstrak: metode abstrak yang dilindungi dan abstrak publik) tetapi Anda dapat membacanya sendiri.
Pada catatan terakhir, kelas abstrak yang hanya menyediakan metode abstrak adalah kelas dasar abstrak "murni" alias antarmuka.
sumber
Dengan kata lain, Anda harus mulai dengan sebuah pertanyaan: "apakah kelas-kelas ini harus berbagi implementasi , atau apakah mereka hanya memiliki antarmuka yang sama ?"
Jika jawabannya beragam, seperti - tiga kelas ini harus berbagi implementasi, tetapi dua lainnya hanya membagikan API mereka - maka Anda dapat membuat antarmuka untuk kelima kelas tersebut, dan kelas abstrak untuk ketiga kelas dengan umum kode.
Ada juga cara lain untuk berbagi implementasi, misalnya untuk merangkum objek dengan implementasi itu (misalnya dalam pola Strategi ).
sumber
Anda akan mendeklarasikan abstrak kelas ketika Anda tidak ingin pengembang (mungkin diri Anda sendiri) diizinkan untuk membuat instantiate, karena itu tidak akan berfungsi atau tidak masuk akal.
Sebagai contoh, pertimbangkan gim di mana ada berbagai jenis entitas gim. Mereka semua mewarisi dari
GameEntity
kelas dasar .Kelas ini dideklarasikan
abstract
karena tidak masuk akal untuk membuat instantiate. Ia mendeklarasikan beberapa aksi untuk entitas game dan beberapa atribut, tetapi di kelas ini tidak ada atribut yang diinisialisasi. Kelas ini berfungsi sebagai templat untuk entitas gim, tetapi tidak dimaksudkan untuk dibuat sendiri, dan seperti yang dinyatakanabstract
.Mengenai perbedaan penggunaan antara kelas abstrak dan antarmuka:
Seperti yang saya lihat, antarmuka adalah cara untuk mendapatkan perilaku polimorfik tanpa dibatasi oleh mekanisme pewarisan tunggal beberapa bahasa.
Mari kita kembali ke permainan sebagai contoh. Pertimbangkan kelas
Enemy
yang berasal dariGameEntity
. Kelas ini memiliki metodeattackMeFromDistance(RangedAttacker attacker)
. Metode ini dimaksudkan untuk memungkinkan entitas untuk menyerang musuh dari jauh.Seperti yang Anda lihat, metode ini menggunakan
RangedAttacker
tipe sebagai parameter. Namun, semua entitas game sudah mewarisi dariGameEntity
. Mereka tidak bisa memperpanjang kelas lain.Ambil kelas
Mage
danArcher
misalnya. Kami ingin memungkinkan keduanya diterima sebagai parameter dalamattackMeFromDistance(RangedAttacker attacker)
metode, tetapi mereka sudah diturunkan dariGameEntity
.Untuk mengatasi ini, kami membuat antarmuka baru:
Kelas yang mengimplementasikan antarmuka ini harus mengimplementasikan
attackFromDistance()
metode ini, dan dengan demikian dipastikan bahwa ia memiliki berbagai kemampuan menyerang. Ini berarti bahwaattackMeFromDistance
metode sekarang dapat dengan aman menerima kelas yang mengimplementasikan antarmuka ini. Jadi membuatMage
danArcher
mengimplementasikan antarmuka itu memecahkan masalah kita.Bagi saya, ini adalah kekuatan antarmuka.
Singkatnya, Anda biasanya akan menggunakan kelas abstrak ketika Anda ingin memiliki kelas dasar untuk beberapa kelas, tetapi tidak masuk akal untuk instantiate dengan sendirinya (atau dalam kasus di mana ia memiliki
abstract
metode, yang harus diimplementasikan oleh subclass, dan dalam hal ini kompiler akan memaksa Anda untuk membuat kelasabstract
). Anda akan menggunakan antarmuka untuk mendapatkan perilaku polimorfik tanpa dibatasi oleh mekanisme pewarisan tunggal.sumber
sumber