Pertanyaan Antarmuka vs Kelas Abstrak (umum OO)


Saya baru-baru ini dua wawancara telepon di mana saya ditanya tentang perbedaan antara Antarmuka dan kelas Abstrak. Saya telah menjelaskan setiap aspek dari mereka yang dapat saya pikirkan, tetapi tampaknya mereka menunggu saya menyebutkan sesuatu yang spesifik, dan saya tidak tahu apa itu.

Dari pengalaman saya, saya pikir hal berikut ini benar. Jika saya kehilangan poin utama tolong beri tahu saya.

Antarmuka:

Setiap Metode yang dideklarasikan dalam Antarmuka harus diimplementasikan dalam subkelas. Hanya Acara, Delegasi, Properti (C #), dan Metode yang dapat ada di Antarmuka. Kelas dapat mengimplementasikan beberapa Antarmuka.

Kelas Abstrak:

Hanya metode abstrak yang harus dilaksanakan oleh subkelas. Kelas Abstrak dapat memiliki metode normal dengan implementasi. Kelas abstrak juga dapat memiliki variabel kelas di samping Acara, Delegasi, Properti dan Metode. Kelas hanya dapat menerapkan satu kelas abstrak hanya karena tidak adanya Multi-warisan di C #.

  1. Setelah semua itu, pewawancara muncul dengan pertanyaan "Bagaimana jika Anda memiliki kelas Abstrak dengan hanya metode abstrak? Bagaimana itu akan berbeda dari sebuah antarmuka?" Saya tidak tahu jawabannya tapi saya pikir itu warisan seperti yang disebutkan di atas kan?

  2. Seorang pewawancara lain bertanya kepada saya bagaimana jika Anda memiliki variabel Publik di dalam antarmuka, bagaimana itu berbeda dari di Kelas Abstrak? Saya bersikeras Anda tidak dapat memiliki variabel publik di dalam antarmuka. Saya tidak tahu apa yang ingin dia dengar tetapi dia juga tidak puas.

Lihat juga:


1197
2018-04-17 16:42


asal


Jawaban:


Sementara pertanyaan Anda menunjukkan itu untuk "OO umum", itu benar-benar tampaknya berfokus pada penggunaan NET dari istilah-istilah ini.

Di .NET (serupa untuk Java):

  • antarmuka tidak dapat memiliki status atau implementasi
  • kelas yang mengimplementasikan antarmuka harus menyediakan implementasi semua metode antarmuka itu
  • kelas abstrak dapat berisi keadaan (anggota data) dan / atau implementasi (metode)
  • kelas abstrak dapat diwariskan tanpa menerapkan metode abstrak (meskipun kelas turunan tersebut adalah abstrak itu sendiri)
  • antarmuka mungkin multiple-mewarisi, kelas abstrak mungkin tidak (ini mungkin alasan konkret utama untuk antarmuka ada secara terpisah dari kelas abtract - mereka mengizinkan implementasi multiple inheritance yang menghilangkan banyak masalah MI umum).

Sebagai istilah OO umum, perbedaannya tidak selalu terdefinisi dengan baik. Sebagai contoh, ada pemrogram C ++ yang mungkin memiliki definisi kaku yang serupa (antarmuka adalah subset kelas abstrak yang ketat yang tidak dapat memuat implementasi), sementara beberapa mungkin mengatakan bahwa kelas abstrak dengan beberapa implementasi standar masih merupakan antarmuka atau yang tidak abstrak kelas masih bisa mendefinisikan antarmuka.

Memang, ada idiom C ++ yang disebut Non-Virtual Interface (NVI) di mana metode publik adalah metode non-virtual yang 'thunk' ke metode virtual pribadi:


632
2018-04-17 17:18



Bagaimana dengan analogi: ketika saya di Angkatan Udara, saya pergi ke pelatihan pilot dan menjadi pilot USAF (Angkatan Udara AS). Pada saat itu saya tidak memenuhi syarat untuk menerbangkan apapun, dan harus mengikuti pelatihan jenis pesawat. Setelah saya memenuhi syarat, saya adalah seorang pilot (kelas Abstrak) dan pilot C-141 (kelas beton). Di salah satu tugas saya, saya diberi tugas tambahan: Petugas Keselamatan. Sekarang saya masih menjadi pilot dan pilot C-141, tetapi saya juga melakukan tugas-tugas Safety Officer (saya menerapkan ISafetyOfficer, boleh dikatakan). Seorang pilot tidak diwajibkan menjadi petugas keselamatan, orang lain juga bisa melakukannya.

Semua pilot USAF harus mengikuti peraturan Angkatan Udara tertentu, dan semua pilot C-141 (atau F-16, atau T-38) adalah 'pilot USAF. Siapa pun bisa menjadi petugas keamanan. Jadi, untuk meringkas:

  • Pilot: kelas abstrak
  • C-141 Pilot: kelas beton
  • Petugas Keamanan: antarmuka

catatan tambahan: ini dimaksudkan untuk menjadi analogi untuk membantu menjelaskan konsep, bukan rekomendasi pengkodean. Lihat berbagai komentar di bawah ini, bahasannya menarik.


754
2017-08-30 04:40



Saya pikir jawaban yang mereka cari adalah perbedaan filosofi fundamental atau OPPS.

Warisan kelas abstrak digunakan ketika kelas turunan berbagi properti inti dan perilaku kelas abstrak. Jenis perilaku yang benar-benar mendefinisikan kelas.

Di sisi lain, warisan antarmuka digunakan ketika kelas berbagi perilaku periferal, yang tidak selalu menentukan kelas turunan.

Untuk misalnya. Mobil dan Truk berbagi banyak properti inti dan perilaku kelas abstrak Automobile, tetapi mereka juga berbagi beberapa perilaku periferal seperti Hasilkan knalpot yang bahkan kelas non-mobil seperti Drillers atau PowerGenerators berbagi dan tidak selalu mendefinisikan Mobil atau Truk , jadi Mobil, Truk, Pengeboran dan PowerGenerator semuanya dapat berbagi antarmuka IExhaust yang sama.


194
2017-08-31 12:09



Pendek: Kelas abstrak digunakan untuk Modeling hirarki kelas kelas yang mirip (Misalnya Hewan dapat menjadi kelas abstrak dan Manusia, Singa, Harimau dapat menjadi kelas turunan konkrit)

DAN

Antarmuka digunakan untuk Komunikasi antara 2 kelas yang serupa / tidak serupa yang tidak peduli tentang jenis antarmuka yang menerapkan kelas (mis. Tinggi dapat menjadi properti antarmuka dan dapat diterapkan oleh Manusia, Bangunan, Pohon. Tidak masalah jika Anda bisa makan, Anda dapat berenang Anda bisa mati atau apa pun .. itu penting hanya hal yang Anda perlu memiliki Tinggi (implementasi di kelas Anda)).


163
2018-04-05 09:53



Ada beberapa perbedaan lain -

Antarmuka tidak dapat memiliki implementasi konkret apa pun. Kelas dasar abstrak dapat. Ini memungkinkan Anda untuk menyediakan implementasi konkret di sana. Hal ini dapat memungkinkan kelas dasar abstrak untuk benar-benar memberikan kontrak yang lebih ketat, sedangkan antarmuka benar-benar hanya menggambarkan bagaimana kelas digunakan. (Kelas dasar abstrak dapat memiliki anggota non-virtual yang mendefinisikan perilaku, yang memberikan lebih banyak kontrol kepada penulis kelas dasar.)

Lebih dari satu antarmuka dapat diimplementasikan di kelas. Kelas hanya dapat berasal dari kelas dasar abstrak tunggal. Ini memungkinkan hierarki polimorfik menggunakan antarmuka, tetapi bukan kelas dasar abstrak. Ini juga memungkinkan pseudo-multi-warisan menggunakan antarmuka.

Kelas dasar abstrak dapat dimodifikasi dalam v2 + tanpa melanggar API. Perubahan pada antarmuka memecah perubahan.

[C # /. NET Specific] Antarmuka, tidak seperti kelas dasar abstrak, dapat diterapkan ke jenis nilai (structs). Struct tidak dapat mewarisi dari kelas dasar abstrak. Ini memungkinkan pedoman kontrak / penggunaan perilaku diterapkan pada jenis nilai.


74
2018-04-17 16:46



Warisan
Pertimbangkan mobil dan bus. Mereka adalah dua kendaraan yang berbeda. Tapi tetap saja, mereka berbagi beberapa sifat umum seperti mereka memiliki kemudi, rem, roda gigi, mesin, dll.
Jadi dengan konsep pewarisan, ini dapat direpresentasikan sebagai berikut ...

public class Vehicle {
    private Driver driver;
    private Seat[] seatArray; //In java and most of the Object Oriented Programming(OOP) languages, square brackets are used to denote arrays(Collections).
    //You can define as many properties as you want here ...
}

Sekarang Sepeda ...

public class Bicycle extends Vehicle {
    //You define properties which are unique to bicycles here ...
    private Pedal pedal;
}

Dan Mobil ...

public class Car extends Vehicle {
    private Engine engine;
    private Door[] doors;
}

Itu saja Warisan. Kami menggunakannya untuk mengklasifikasikan objek ke bentuk Basis yang lebih sederhana dan anak-anak mereka seperti yang kita lihat di atas.

Kelas Abstrak

Kelas abstrak adalah tidak lengkap objek. Untuk memahami lebih jauh, mari kita simak analogi kendaraan sekali lagi.
Sebuah kendaraan bisa dikendarai. Kanan? Tetapi kendaraan yang berbeda didorong dengan cara yang berbeda ... Misalnya, Anda tidak dapat mengendarai mobil sama seperti Anda mengendarai sepeda.
Jadi bagaimana cara merepresentasikan fungsi drive kendaraan? Lebih sulit untuk memeriksa apa jenis kendaraan itu dan mengendarainya dengan fungsinya sendiri; Anda harus mengganti kelas Pengemudi lagi dan lagi saat menambahkan jenis kendaraan baru.
Di sinilah peran kelas dan metode abstrak. Anda dapat menetapkan metode drive sebagai abstrak untuk memberi tahu bahwa setiap anak yang mewarisi harus menerapkan fungsi ini.
Jadi jika Anda memodifikasi kelas kendaraan ...

//......Code of Vehicle Class
abstract public void drive();
//.....Code continues

Sepeda dan Mobil juga harus menentukan cara mengendarainya. Jika tidak, kode tidak akan dikompilasi dan kesalahan dilemparkan.
Singkatnya .. kelas abstrak adalah kelas yang sebagian tidak lengkap dengan beberapa fungsi yang tidak lengkap, yang mana anak-anak yang mewarisi harus menentukan sendiri.

Antarmuka Antarmuka benar-benar tidak lengkap. Mereka tidak memiliki properti apa pun. Mereka hanya menunjukkan bahwa anak-anak yang mewarisi mampu melakukan sesuatu ...
Misalkan Anda memiliki berbagai jenis ponsel dengan Anda. Masing-masing memiliki cara berbeda untuk melakukan fungsi yang berbeda; Ex: panggil seseorang. Pembuat ponsel menentukan cara melakukannya. Di sini ponsel dapat menghubungi nomor - yaitu, dapat dial-mampu. Mari kita wakili ini sebagai antarmuka.

public interface Dialable {
    public void dial(Number n);
}

Di sini pembuat Dialable menentukan cara memanggil nomor. Anda hanya perlu memberinya nomor untuk dial.

// Makers define how exactly dialable work inside.

Dialable PHONE1 = new Dialable() {
    public void dial(Number n) {
        //Do the phone1's own way to dial a number
    }
}

Dialable PHONE2 = new Dialable() {
    public void dial(Number n) {
        //Do the phone2's own way to dial a number
    }
}


//Suppose there is a function written by someone else, which expects a Dialable
......
public static void main(String[] args) {
    Dialable myDialable = SomeLibrary.PHONE1;
    SomeOtherLibrary.doSomethingUsingADialable(myDialable);
}
.....

Dengan ini menggunakan antarmuka bukan kelas abstrak, penulis fungsi yang menggunakan Dialable tidak perlu khawatir tentang propertinya. Ex: Apakah itu memiliki layar sentuh atau dial pad, Apakah itu telepon darat tetap atau ponsel. Anda hanya perlu tahu apakah itu dialable; apakah itu mewarisi (atau menerapkan) antarmuka Dialable.

Dan yang lebih penting, jika suatu saat Anda mengganti Dialable dengan yang lain

......
public static void main(String[] args) {
    Dialable myDialable = SomeLibrary.PHONE2; // <-- changed from PHONE1 to PHONE2
    SomeOtherLibrary.doSomethingUsingADialable(myDialable);
}
.....

Anda dapat yakin bahwa kode masih berfungsi dengan baik karena fungsi yang menggunakan dialable tidak (dan tidak bisa) bergantung pada detail selain yang ditentukan dalam antarmuka Dialable. Mereka berdua mengimplementasikan antarmuka Dialable dan itulah satu-satunya fungsi yang perlu diperhatikan.

Antarmuka biasanya digunakan oleh pengembang untuk memastikan interoperabilitas (penggunaan secara bergantian) antar objek, sejauh mereka berbagi fungsi yang sama (seperti Anda dapat mengubah ke telepon rumah atau ponsel, sejauh Anda hanya perlu menghubungi nomor). Singkatnya, antarmuka adalah versi yang lebih sederhana dari kelas abstrak, tanpa properti apa pun.
Juga, perhatikan bahwa Anda dapat mengimplementasikan (mewarisi) sebanyak antarmuka yang Anda inginkan tetapi Anda hanya dapat memperpanjang (mewarisi) satu kelas induk.

Info lebih lanjut Kelas abstrak vs Antarmuka 


63
2018-06-14 13:11



Jika Anda mempertimbangkan java sebagai bahasa OOP untuk menjawab pertanyaan ini, rilis Java 8 menyebabkan beberapa konten dalam jawaban di atas sebagai usang. Sekarang antarmuka java dapat memiliki metode standar dengan implementasi konkret.

Peramal situs web memberikan perbedaan utama antara interface dan abstract kelas.

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.

Dalam istilah sederhana, saya ingin menggunakannya

antarmuka: Untuk menerapkan kontrak dengan beberapa objek yang tidak terkait

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

Lihatlah contoh kode untuk memahami berbagai hal dengan jelas: Bagaimana seharusnya saya menjelaskan perbedaan antara Antarmuka dan kelas Abstrak?


33
2017-11-27 19:20



Para pewawancara menyalak pohon aneh. Untuk bahasa seperti C # dan Java, ada perbedaan, tetapi dalam bahasa lain seperti C ++ tidak ada perbedaan. Teori OO tidak membedakan keduanya, hanya sintaksis bahasa.

Kelas abstrak adalah kelas dengan implementasi dan antarmuka (metode virtual murni) yang akan diwariskan. Antarmuka umumnya tidak memiliki implementasi tetapi hanya fungsi virtual murni.

Di C # atau Java, kelas abstrak tanpa penerapan apa pun berbeda dari antarmuka hanya dalam sintaks yang digunakan untuk mewarisi darinya dan fakta yang hanya dapat Anda warisi dari satu.


30
2018-04-17 16:48