Apa perbedaan antara kelas abstrak, antarmuka, dan kapan menggunakannya


15

Baru-baru ini saya sudah mulai membungkus kepala saya di sekitar OOP, dan saya sekarang ke titik di mana semakin saya membaca tentang perbedaan antara kelas abstrak dan antarmuka semakin bingung saya menjadi. Sejauh ini, tidak ada yang bisa dipakai. Antarmuka lebih atau kurang cetak biru struktural yang menentukan kerangka dan abstrak berbeda dengan dapat mengimplementasikan sebagian kode.

Saya ingin belajar lebih banyak tentang ini melalui situasi khusus saya. Berikut ini tautan ke pertanyaan pertama saya jika Anda ingin sedikit informasi latar belakang: Apa model desain yang bagus untuk kelas baru saya?

Berikut adalah dua kelas yang saya buat:

class Ad {
    $title;
    $description
    $price;

    function get_data($website){  }

    function validate_price(){  }
 }


class calendar_event {
    $title;
    $description

    $start_date;

    function get_data($website){ //guts }

    function validate_dates(){ //guts }
 }

Jadi, seperti yang Anda lihat, kelas-kelas ini hampir identik. Tidak ditampilkan di sini, tetapi ada fungsi lain like get_zip(),, save_to_database()yang umum di kelas saya. Saya juga menambahkan kelas lain Mobil dan Hewan Peliharaan yang memiliki semua metode umum dan tentu saja sifat khusus untuk kelas-kelas tersebut (jarak tempuh, berat, misalnya).

Sekarang saya telah melanggar prinsip KERING dan saya mengelola dan mengubah kode yang sama di beberapa file. Saya berniat memiliki lebih banyak kelas seperti perahu, kuda, atau apa pun.

Jadi apakah ini tempat saya akan menggunakan antarmuka atau kelas abstrak? Dari apa yang saya mengerti tentang kelas abstrak, saya akan menggunakan kelas super sebagai templat dengan semua elemen umum yang dibangun ke dalam kelas abstrak, dan kemudian hanya menambahkan item yang secara khusus dibutuhkan di kelas mendatang. Sebagai contoh:

abstract class content {
    $title;
    $description


    function get_data($website){  }

    function common_function2() { }
    function common_function3() { }
 }


class calendar_event extends content {

    $start_date;

    function validate_dates(){  }
 }

Atau apakah saya akan menggunakan antarmuka dan, karena ini sangat mirip, membuat struktur yang masing-masing subkelas dipaksa untuk digunakan karena alasan integritas, dan menyerahkannya kepada pengembang akhir yang menyempurnakan kelas yang bertanggung jawab untuk masing-masing rincian bahkan fungsi-fungsi umum. pemikiran saya di sana adalah bahwa beberapa fungsi 'umum' mungkin perlu diubah di masa depan untuk kebutuhan kelas khusus mereka.

Terlepas dari semua itu di atas, jika Anda yakin saya salah memahami apa dan mengapa kelas abstrak dan antarmuka sama sekali, tentu saja biarkan jawaban yang valid untuk berhenti berpikir ke arah ini dan menyarankan cara yang tepat untuk bergerak maju!

Terima kasih!


Ada banyak contoh online yang bagus. Saya pikir ini salah satunya. javapapers.com/core-java/abstract-and-interface-core-java-2/…
Siva

Jawaban:


26

Dalam istilah awam:

Antarmuka adalah untuk tipe hubungan "bisa melakukan / dapat diperlakukan sebagai" .

Kelas abstrak (juga konkret) adalah untuk jenis hubungan "adalah" .

Lihatlah contoh-contoh ini:

class Bird extends Animal implements Flight;
class Plane extends Vehicle implements Flight, AccountableAsset;
class Mosquito extends Animal implements Flight;
class Horse extends Animal;
class RaceHorse extends Horse implements AccountableAsset;
class Pegasus extends Horse implements Flight;

Bird, Mosquitodan Horse sedang Animals . Mereka terkait. Mereka mewarisi metode umum dari Hewan suka eat(), metabolize() and reproduce(). Mungkin mereka menimpa metode ini, menambahkan sedikit tambahan untuk mereka, tetapi mereka mengambil keuntungan dari perilaku default yang diterapkan pada HewanmetabolizeGlucose().

Planetidak terkait dengan Bird, Mosquitoatau Horse.

Flightdiimplementasikan oleh berbeda, kelas yang tidak terkait, suka Birddan Plane.

AccountableAssetjuga diimplementasikan oleh kelas yang berbeda dan tidak terkait, seperti Planedan RaceHorse.

Horse tidak menerapkan Penerbangan.

Seperti yang Anda lihat kelas (abstrak atau konkret) membantu Anda membangun hierarki , membiarkan Anda mewarisi kode dari level atas ke level bawah hierarki. Secara teori, semakin rendah Anda dalam hierarki, semakin khusus perilaku Anda, tetapi Anda tidak perlu khawatir tentang banyak hal yang sudah diurus.

Antarmuka , di sisi lain, tidak menciptakan hierarki, tetapi mereka dapat membantu menyeragamkan perilaku tertentu lintas hierarki sehingga Anda dapat memisahkannya dari hierarki dalam konteks tertentu.

Misalnya, Anda dapat memiliki program yang menjumlahkan nilai grup AccountableAssetsterlepas dari keberadaan mereka RaceHorsesatau Planes.


Luar biasa. Antarmuka menyediakan bagian fungsionalitas tertentu yang membebankan can do/can be treated asdimana kelas abstrak bertindak sebagai dasar!
Abhiroj Panwar

13

Anda dapat menyimpulkan jawabannya secara logis karena Anda tampaknya menyadari perbedaan di antara keduanya.

Antarmuka mendefinisikan kontrak bersama. Seperti antarmuka yang disebut IAnimal, di mana semua hewan berbagi fungsi seperti Eat (), Move (), Attack () dll. Sementara mereka semua memiliki fungsi yang sama, semua atau kebanyakan dari mereka memiliki cara yang berbeda (implementasi) untuk mencapai Itu.

Kelas abstrak mendefinisikan implementasi umum dan kontrak umum opsional. Misalnya Kalkulator sederhana dapat dikualifikasikan sebagai kelas abstrak yang mengimplementasikan semua operator logis dan bitwise dasar dan kemudian diperluas oleh ScientificCalculator, GraphicalCalculator, dan sebagainya.

Jika Anda memiliki implementasi umum maka dengan segala cara, merangkum fungsi dalam kelas abstrak untuk memperpanjang. Saya memiliki hampir 0 pengalaman PHP, tetapi saya tidak berpikir Anda dapat membuat antarmuka dengan bidang yang tidak konstan. Jika bidangnya umum di antara kelas instance Anda, maka Anda terpaksa menggunakan kelas abstrak, kecuali jika Anda menentukan aksesnya melalui getter dan setter.

Juga, tampaknya tidak ada kekurangan hasil di Google.


3

Singkat cerita. Kelas abstrak lebih mirip Antarmuka karena keduanya memberikan templat tentang metode apa yang harus ada dalam kelas pewarisan, tetapi ada perbedaan besar: - Antarmuka hanya menentukan nama / jenis metode yang perlu ada di kelas pewarisan, sementara absen kelas dapat memiliki kode metode lengkap yang lengkap dan hanya detail yang mungkin perlu dikuasai. - Antarmuka tidak dapat memiliki pengubah akses. - Antarmuka tidak dapat memiliki bidang. - Kelas tidak dapat memiliki beberapa warisan kelas, sementara mereka dapat mewarisi banyak antarmuka. - Juga, kelas menyediakan struktur hierarki sehingga hanya kelas yang berasal dari kelas tertentu yang harus mengikuti panduan dari kelas abstrak: objek-> objek spesifik-> objek yang sangat spesifik. Antarmuka di sisi lain dapat diwarisi oleh siapa saja di mana saja.

Menurut pendapat saya, kelas abstrak lebih umum karena mereka dapat langsung memberikan implementasi kode secara default, tetapi dalam proyek skala besar di mana Anda perlu membuat standar kelas tertentu, antarmuka bisa berguna.

Semoga itu bisa membantu, tetapi ada banyak info tentang ini secara online, Leo


2
Classes cannot have multiple inheritance- Benar untuk bahasa seperti Java dan C #, tidak berlaku untuk C ++.
Robert Harvey

3

Pertama, Anda harus memahami bahwa Anda akan sering menyediakan antarmuka dan kelas abstrak. Alasan untuk ini, dan perbedaan inti antara keduanya, adalah bahwa mereka memungkinkan Anda untuk menggunakan kembali kode yang berbeda, dan memecahkan masalah yang berbeda.

Antarmuka memungkinkan Anda untuk menggunakan kembali kode klien dengan implementasi yang berbeda. Klien dari Anda get_data ($ situs web) kelas tidak peduli tentang $ title atau $ description items. Itu hanya ingin menginstruksikan konten Anda untuk memuat data. Jika Anda memiliki berbagai jenis konten, beberapa di antaranya memerlukan $ deskripsi, dan beberapa yang tidak, Anda bisa memberikan kelas ContentInterface yang hanya menentukan tanda tangan dari kelas anak Anda. Sekarang klien dapat memiliki sejumlah Konten berbeda tanpa setiap tahu persis bagaimana mereka bekerja. The Liskov Pergantian Prinsip adalah hal yang baik untuk membaca tentang untuk mempelajari ide ini. Saya juga suka tulisan Paman Bob tentang topik ini. Antarmuka sangat penting untuk pengujian unit, dan membuat antarmuka adalah kebiasaan yang baik untuk dipelajari.

Kelas abstrak memungkinkan Anda untuk menggunakan kembali detail implementasi umum di seluruh kelas yang berbagi nenek moyang yang sama. Dalam pertanyaan Anda, Anda tampaknya memiliki pegangan yang baik tentang mengapa Anda akan mewarisi implementasi dari kelas abstrak. Masih berbahaya untuk bergantung pada internal kelas dasar - sangat mudah untuk melanggar enkapsulasi dan membuat anak-anak yang bergantung pada detail implementasi spesifik dari kelas dasar. The Metode Template Pola memberikan contoh yang umum dan sehat bagaimana menggunakan kelas dasar tanpa melanggar enkapsulasi.

Jadi, seperti yang saya harap saya tunjukkan, Anda akan sering menyediakan antarmuka untuk klien dari hierarki kelas Anda, sehingga Anda dapat dengan aman mengubah implementasi Anda tanpa memengaruhi kode klien. Ini memungkinkan klien untuk menulis unit test menggunakan Mock Objects yang mewarisi antarmuka Anda. Dan Anda juga akan memberikan kelas abstrak yang memungkinkan penggunaan kembali logika umum atau menegakkan semantik untuk kelas anak.


3

Perbedaan itu halus tetapi jelas. Antarmuka adalah tentang perilaku polimorfik. Kelas abstrak adalah tentang penggunaan kembali dan perilaku polimorfik.

Jika Anda ingin menekankan pada penggunaan kembali dan perilaku polimorfik, pilih kelas abstrak. Misalnya, tipe karyawan yang berbeda memiliki ketentuan yang berbeda tetapi semuanya menerima beberapa hal yang sama. Jadi, kelas abstrak cocok untuk mewakilinya karena kesamaan dapat diekspresikan dalam kelas abstrak dasar Employeedan perbedaannya dapat diimplementasikan dalam kelas turunan seperti Manageratau Workerdll.

Jika Anda ingin menekankan hanya pada perilaku polimorfik, pilih antarmuka. Antarmuka lebih tentang kontrak, yaitu, suatu objek atau hierarki yang mengatakan itu sesuai dengan perilaku tertentu. Sebagai contoh, semua karyawan memiliki ketentuan cuti tetapi berbagai jenis karyawan memiliki berbagai jenis ketentuan. Jadi, setiap jenis karyawan yang berbeda memerlukan kalkulator cuti yang berbeda. Di sini antarmuka adalah pilihan yang baik karena semua jenis karyawan dapat menerapkan LeaveCalculatorantarmuka dengan Calculate()perilaku berbeda.


-3
  1. Perbedaan utama adalah metode antarmuka Java abstrak secara implisit dan tidak dapat diimplementasikan. Kelas abstrak Java dapat memiliki metode instan yang menerapkan perilaku default.
  2. Variabel yang dideklarasikan dalam antarmuka Java secara default final. Kelas abstrak dapat berisi variabel non-final.
  3. Anggota antarmuka Java bersifat publik secara default. Kelas abstrak Java dapat memiliki cita rasa anggota kelas seperti privat, dilindungi, dll
  4. Antarmuka Java harus diimplementasikan menggunakan kata kunci "implement"; Kelas abstrak Java harus diperluas menggunakan kata kunci "extends".
  5. Antarmuka dapat memperluas antarmuka Java lain hanya kelas abstrak yang dapat memperluas kelas Java lain dan mengimplementasikan beberapa antarmuka Java.
  6. Kelas Java dapat mengimplementasikan banyak antarmuka tetapi hanya dapat memperluas satu kelas abstrak.
  7. Antarmuka benar-benar abstrak dan tidak dapat dipakai; Kelas abstrak Java juga tidak bisa dipakai, tetapi bisa dipanggil jika main () ada.
  8. Dibandingkan dengan kelas abstrak java, antarmuka java lambat karena memerlukan tipuan ekstra.
  9. Antarmuka dan kelas abstrak di Java adalah Anda tidak dapat membuat metode non-abstrak dalam antarmuka, setiap metode di antarmuka secara default abstrak, tetapi Anda dapat membuat metode non-abstrak di kelas abstrak.
  10. Kelas abstrak vs antarmuka di Jawa adalah bahwa, antarmuka lebih cocok untuk deklarasi tipe dan kelas abstrak lebih cocok untuk penggunaan kembali kode dan perspektif evolusi.
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.