Pertanyaan Apa perbedaan antara antarmuka dan kelas abstrak?


Apa sebenarnya perbedaan antara antarmuka dan kelas abstrak?


1468
2017-12-16 08:15


asal


Jawaban:


Antarmuka

Antarmuka adalah a kontrak: Orang yang menulis antarmuka berkata, "hei, saya menerima hal-hal yang terlihat seperti itu", dan orang yang menggunakan antarmuka mengatakan"OK, kelas yang saya tulis terlihat seperti itu".

Antarmuka adalah cangkang kosong. Hanya ada tanda tangan dari metode, yang menyiratkan bahwa metode tidak memiliki tubuh. Antarmuka tidak dapat melakukan apa-apa. Itu hanya sebuah pola.

Misalnya (pseudo code):

// I say all motor vehicles should look like this:
interface MotorVehicle
{
    void run();

    int getFuel();
}

// My team mate complies and writes vehicle looking that way
class Car implements MotorVehicle
{

    int fuel;

    void run()
    {
        print("Wrroooooooom");
    }


    int getFuel()
    {
        return this.fuel;
    }
}

Menerapkan sebuah antarmuka memakan sangat sedikit CPU, karena itu bukan kelas, hanya sekelompok nama, dan karena itu tidak ada pencarian yang mahal untuk dilakukan. Ini bagus ketika penting, seperti di perangkat yang disematkan.


Kelas abstrak

Kelas abstrak, tidak seperti antarmuka, adalah kelas. Mereka lebih mahal untuk digunakan, karena ada yang harus dilakukan ketika Anda mewarisi dari mereka.

Kelas abstrak sangat mirip dengan antarmuka, tetapi mereka memiliki sesuatu yang lebih banyak: Anda dapat menentukan perilaku untuk mereka. Ini lebih tentang seseorang yang mengatakan, "kelas-kelas ini akan terlihat seperti itu, dan mereka memiliki kesamaan, jadi isilah yang kosong!".

Sebagai contoh:

// I say all motor vehicles should look like this:
abstract class MotorVehicle
{

    int fuel;

    // They ALL have fuel, so lets implement this for everybody.
    int getFuel()
    {
         return this.fuel;
    }

    // That can be very different, force them to provide their
    // own implementation.
    abstract void run();
}

// My teammate complies and writes vehicle looking that way
class Car extends MotorVehicle
{
    void run()
    {
        print("Wrroooooooom");
    }
}

Pelaksanaan

Meskipun kelas dan antarmuka abstrak seharusnya merupakan konsep yang berbeda, namun penerapannya membuat pernyataan itu terkadang tidak benar. Terkadang, mereka bahkan tidak seperti yang Anda pikirkan.

Di Jawa, aturan ini sangat ditegakkan, sementara di PHP, antarmuka adalah kelas abstrak tanpa metode yang dinyatakan.

Dalam Python, kelas abstrak lebih merupakan trik pemrograman yang bisa Anda dapatkan dari modul ABC dan sebenarnya menggunakan metaclasses, dan oleh karena itu kelas. Dan antarmuka lebih terkait dengan mengetik bebek dalam bahasa ini dan itu campuran antara konvensi dan metode khusus yang menyebut deskriptor (metode __method__).

Seperti biasa dengan pemrograman, ada teori, latihan, dan latihan dalam bahasa lain :-)


1966
2017-12-16 08:37



Perbedaan teknis utama antara suatu kelas abstrak dan sebuah antarmuka adalah:

  • Kelas abstrak dapat memiliki konstanta, anggota, metode bertopik (metode tanpa badan) dan metode yang ditentukan, sedangkan antarmuka hanya dapat memiliki konstanta dan metode bertopik.

  • Metode dan anggota kelas abstrak dapat didefinisikan dengan setiap visibilitas, sedangkan semua metode antarmuka harus didefinisikan sebagai public (mereka didefinisikan publik secara default).

  • Ketika mewarisi kelas abstrak, a beton kelas anak harus menentukan metode abstrak, sedangkan kelas abstrak dapat memperluas kelas abstrak lain dan metode abstrak dari kelas induk tidak harus didefinisikan.

  • Demikian pula, sebuah antarmuka memperluas antarmuka lain tidak bertanggung jawab untuk menerapkan metodedari antarmuka induk. Ini karena antarmuka tidak dapat mendefinisikan implementasi apa pun.

  • Kelas anak hanya bisa memperpanjang satu kelas (abstrak atau beton), sedangkan antarmuka dapat memperpanjang atau kelas dapat mengimplementasikan beberapa antarmuka lainnya.

  • Kelas anak dapat mendefinisikan metode abstrak dengan visibilitas yang sama atau kurang restriktif, sedangkan kelas yang mengimplementasikan antarmuka harus menentukan metode dengan visibilitas yang sama (publik).


749
2017-12-16 10:11



Antarmuka hanya berisi definisi / tanda fungsi, dan jika kita memiliki beberapa fungsi umum serta tanda tangan umum, maka kita perlu menggunakan kelas abstrak. Dengan menggunakan kelas abstrak, kami dapat memberikan perilaku serta fungsi keduanya dalam waktu yang bersamaan. Pengembang lain yang mewarisi kelas abstrak dapat menggunakan fungsi ini dengan mudah, karena mereka hanya perlu mengisi bagian yang kosong.

enter image description here

Diambil dari:

http://www.dotnetbull.com/2011/11/difference-between-abstract-class-and.html

http://www.dotnetbull.com/2011/11/what-is-abstract-class-in-c-net.html http://www.dotnetbull.com/2011/11/what-is-interface-in-c-net.html


108
2017-09-15 08:59



Penjelasan dapat ditemukan di sini: http://www.developer.com/lang/php/article.php/3604111/PHP-5-OOP-Interfaces-Abstract-Classes-and-the-Adapter-Pattern.htm

Kelas abstrak adalah kelas yang   hanya sebagian yang dilaksanakan oleh   programmer. Ini mungkin berisi satu atau lebih   metode abstrak. Metode abstrak   hanyalah sebuah definisi fungsi   berfungsi untuk memberi tahu programmer bahwa   metode harus diterapkan pada anak   kelas.

Antarmuka mirip dengan abstrak   kelas; memang antarmuka menempati   namespace yang sama dengan kelas dan abstrak   kelas. Karena itu, Anda tidak bisa   mendefinisikan sebuah antarmuka dengan nama yang sama   sebagai kelas. Antarmuka adalah sepenuhnya   kelas abstrak; tidak ada metodenya   diimplementasikan dan bukannya kelas   sub-classing dari itu, dikatakan   mengimplementasikan antarmuka itu.

Pokoknya saya menemukan penjelasan antarmuka ini agak membingungkan. Definisi yang lebih umum adalah: Sebuah antarmuka mendefinisikan kontrak yang harus dipenuhi oleh kelas pelaksana. Definisi antarmuka terdiri dari tanda tangan anggota publik, tanpa kode pelaksana.


76
2017-12-16 08:18



Beberapa perbedaan penting:

Dalam bentuk tabel:

Difference

Sebagai dinyatakan oleh Joe dari javapaper:

Perbedaan 1.Main adalah metode antarmuka Java secara implisit abstrak dan tidak dapat memiliki implementasi. Kelas abstrak Java bisa   memiliki metode instan yang mengimplementasikan perilaku default.

2. Variabel yang dideklarasikan dalam antarmuka Java secara default final. Kelas abstrak dapat berisi variabel-variabel tidak final.

3. Anggota antarmuka Java bersifat publik secara default. Kelas abstrak Java dapat memiliki rasa yang biasa dari anggota kelas seperti pribadi,   dilindungi, dll.

4.Java antarmuka harus diimplementasikan menggunakan kata kunci "mengimplementasikan"; Kelas abstrak Java harus diperluas menggunakan kata kunci "memanjang".

5. Antarmuka dapat memperpanjang antarmuka Java lain saja, kelas abstrak dapat memperpanjang kelas Java lain dan menerapkan beberapa Java   antarmuka.

Kelas Java 6.A dapat mengimplementasikan beberapa antarmuka tetapi dapat memperpanjang hanya satu kelas abstrak.

7. Antarmuka benar-benar abstrak dan tidak dapat dipakai; Kelas abstrak Java juga tidak dapat dipakai, tetapi dapat dipanggil jika a   main () ada.

8.Dibandingkan dengan kelas java abstrak, antarmuka java lambat karena membutuhkan tambahan tipuan.


36
2018-05-16 05:55



Saya tidak ingin menyoroti perbedaan, yang telah dikatakan dalam banyak jawaban (mengenai pengubah akhir statis publik untuk variabel dalam antarmuka & dukungan untuk metode privat yang dilindungi dalam kelas abstrak)

Dalam istilah sederhana, saya ingin mengatakan:

antarmuka: Untuk menerapkan kontrak dengan beberapa objek yang tidak terkait

kelas abstrak: Untuk menerapkan perilaku yang sama atau berbeda di antara beberapa objek terkait

Dari Oracle dokumentasi

Pertimbangkan untuk menggunakan kelas abstrak jika:

  1. Anda ingin berbagi kode di antara beberapa kelas yang terkait erat.
  2. Anda berharap bahwa kelas yang memperluas kelas abstrak Anda memiliki banyak metode atau bidang umum, atau memerlukan pengubah akses selain publik (seperti dilindungi dan pribadi).
  3. Anda ingin menyatakan bidang non-statis atau non-final.

Pertimbangkan untuk menggunakan antarmuka jika:

  1. Anda berharap bahwa kelas yang tidak terkait akan mengimplementasikan antarmuka Anda. Sebagai contoh, banyak objek yang tidak terkait dapat mengimplementasikan Serializable antarmuka.
  2. Anda ingin menentukan perilaku tipe data tertentu, tetapi tidak peduli tentang siapa yang mengimplementasikan perilakunya.
  3. Anda ingin mengambil keuntungan dari multiple inheritance of type.

kelas abstrak menetapkan "adalah" hubungan dengan kelas-kelas konkrit. antarmuka menyediakan "memiliki" kemampuan untuk kelas.

Jika Anda mencari Java sebagai bahasa pemrograman, berikut beberapa pembaruan lainnya:

Java 8 telah mengurangi kesenjangan antara interface dan abstract kelas sampai taraf tertentu dengan menyediakan default fitur metode. Antarmuka tidak memiliki implementasi untuk suatu metode tidak lagi berlaku sekarang.

Lihat dokumentasi ini halaman untuk lebih jelasnya.

Lihatlah pertanyaan SE ini untuk contoh kode agar lebih memahami.

Bagaimana seharusnya saya menjelaskan perbedaan antara Antarmuka dan kelas Abstrak?


34
2017-11-27 12:42



Poin utamanya adalah bahwa:

  • Abstrak berorientasi objek. Ia menawarkan data dasar yang harus dimiliki oleh 'objek' dan / atau fungsi yang seharusnya dapat dilakukannya. Ini berkaitan dengan karakteristik dasar objek: apa yang dimiliki dan apa yang dapat dilakukannya. Oleh karena itu objek yang mewarisi dari kelas abstrak yang sama berbagi karakteristik dasar (generalisasi).
  • Antarmuka berorientasi fungsi. Ini mendefinisikan fungsionalitas yang seharusnya dimiliki suatu objek. Terlepas dari objek apa itu, selama ia dapat melakukan fungsi-fungsi ini, yang didefinisikan dalam antarmuka, itu baik-baik saja. Itu mengabaikan yang lainnya. Objek / kelas dapat berisi beberapa fungsi (kelompok); maka dimungkinkan bagi kelas untuk mengimplementasikan beberapa antarmuka.

22
2017-09-29 09:54



Ketika Anda ingin memberikan perilaku polimorfik dalam hierarki warisan, gunakan kelas abstrak.

Bila Anda ingin perilaku polimorfik untuk kelas yang sama sekali tidak berhubungan, gunakan antarmuka.


20
2018-05-28 04:42



Saya membangun gedung 300 lantai

Cetak biru bangunan antarmuka

  • Misalnya, Servlet (I)

Bangunan yang dibangun hingga 200 lantai - sebagian selesai ---abstrak

  • Implementasi parsial, misalnya, servlet generik dan HTTP

Konstruksi bangunan selesai-beton

  • Implementasi penuh, misalnya, servlet sendiri

Antarmuka

  • Kami tidak tahu apa-apa tentang implementasi, hanya persyaratan. Kita dapat pergi untuk sebuah antarmuka.
  • Setiap metode bersifat publik dan abstrak secara default
  • Ini adalah kelas abstrak murni 100%
  • Jika kami menyatakan publik, kami tidak dapat menyatakan pribadi dan dilindungi
  • Jika kita menyatakan abstrak, kita tidak dapat menyatakan final, statis, sinkron, strictfp dan asli
  • Setiap antarmuka memiliki publik, statis dan final
  • Serialisasi dan sementara tidak berlaku, karena kami tidak dapat membuat instance untuk antarmuka
  • Tidak mudah menguap karena sudah final
  • Setiap variabel bersifat statis
  • Saat kami mendeklarasikan variabel di dalam antarmuka, kami perlu menginisialisasi variabel saat mendeklarasikan
  • Instance dan blok statis tidak diizinkan

Abstrak

  • Implementasi parsial
  • Ini memiliki metode abstrak. Tambahan, menggunakan beton
  • Tidak ada batasan untuk pengubah metode kelas abstrak
  • Tidak ada batasan untuk pengubah variabel kelas abstrak
  • Kami tidak dapat menyatakan pengubah lain kecuali abstrak
  • Tidak ada batasan untuk menginisialisasi variabel

Diambil dari Situs DurgaJobs


20
2017-07-09 18:00



Mari kita kerjakan pertanyaan ini lagi:

Hal pertama yang memberi tahu Anda adalah bahwa 1/1 dan 1 * 1 menghasilkan hal yang sama, tetapi itu tidak berarti bahwa perkalian dan pembagian adalah sama. Tentunya, mereka memiliki hubungan yang baik, tetapi pikiran Anda berdua berbeda.

Saya akan menunjukkan perbedaan utama, dan sisanya sudah dijelaskan:

Kelas abstrak berguna untuk memodelkan hirarki kelas. Pada pandangan pertama dari persyaratan apa pun, kami jelas sebagian tentang apa persis harus dibangun, tapi kami tahu apa yang harus dibangun. Jadi kelas abstrak Anda adalah kelas dasar Anda.

Antarmuka berguna untuk membiarkan hierarki atau kelas lain mengetahui apa yang mampu saya lakukan. Dan ketika Anda mengatakan saya mampu melakukan sesuatu, Anda harus memiliki kapasitas itu. Antarmuka akan menandainya sebagai wajib bagi sebuah kelas untuk mengimplementasikan fungsi yang sama.


17
2018-04-11 05:18