Kapan menerapkan dan memperluas? [Tutup]

90
  • Kapan sebaiknya implementatau extenddigunakan?
  • Apa sajakah contoh dunia nyata?

Apakah ini benar?

Menerapkan tampaknya menjadi cara untuk memaksakan bahwa metode tertentu ada di kelas, dan bahwa pemanggilan fungsi metode ini diformat dengan benar. Menerapkan bukanlah cara untuk meneruskan variabel atau "pengaturan" ke kelas?

Skenario kehidupan nyata yang diharapkan: Saya memiliki platform e-niaga yang menampilkan beberapa kelas pembayaran yang semuanya mengikuti desain yang sama. Ketika kelas pembayaran baru harus ditambahkan, sangat mudah untuk mengikuti desain yang ditentukan interfaceuntuk memastikan bahwa semua potongan ada di sana, dari awal.

Memperluas kelas membuat kelas diperpanjang (anak?) Mewarisi semuanya dari kelas induknya kecuali metode & variabel yang dideklarasikan sebagai private?

Skenario kehidupan nyata yang diharapkan: Saya memiliki satu kelas yang dipanggil sessionsdengan dua kelas anak bernama sessioncookiesdan databasesessions. sessioncookiesdan databasesessions, bersama-sama mewarisi sejumlah opsi konfigurasi bersama dari sesi induknya, sehingga memudahkan untuk mengubah opsi konfigurasi untuk memengaruhi semua jenis penyimpanan data pengunjung pada akhirnya.

Industri
sumber
1
Saya sarankan Anda membaca tentang warisan.
Rafe Kettler

Jawaban:

64

Warisan berguna untuk mengurangi jumlah kode yang Anda tulis ulang. Jika Anda memiliki beberapa kelas dengan beberapa metode atau bidang umum, alih-alih mendefinisikan metode dan bidang ini berulang kali, Anda dapat memfaktorkannya ke dalam kelas dasar dan meminta setiap kelas anak memperluas kelas dasar tersebut.

Antarmuka (dan implements) berguna ketika Anda ingin mendefinisikan protokol umum tentang bagaimana sekelompok objek harus berperilaku. Misalnya, Anda mungkin ingin mengamanatkan bahwa objek yang sebanding dapat dibandingkan untuk persamaan dan hash, dll.

Menggunakan warisan pada akhirnya merupakan pilihan desain. Waspadai kasus di mana Anda mendefinisikan metode yang sama di beberapa kelas; itu adalah kasus yang sangat baik di mana Anda dapat memfaktorkan metode tersebut ke dalam kelas dasar. Hal yang sama berlaku untuk kelas yang mengamati beberapa karakteristik yang sama: Anda dapat menjamin konsistensi dengan meletakkan karakteristik tersebut dalam antarmuka untuk diimplementasikan oleh kelas terkait tersebut.

Warisan adalah konsep besar dalam OOP yang lebih dari sekadar PHP. Saya sarankan Anda membaca artikel wikipedia tentang warisan dan mungkin Pola Desain oleh Gang of Four .

Saya percaya pemahaman Anda tentang warisan sebagian besar benar. Langkah selanjutnya adalah menggunakannya dalam produksi.

Rafe Kettler
sumber
4
Banyak orang kini menganggap buku The Gang of Four terlalu berat dari segi materi sebagai pengantar pola desain. Alternatif yang populer adalah Head First: Design Patterns yang membuat pembacaan lebih ringan. amazon.co.uk/Head-First-Design-Patterns-Freeman/dp/0596007124
Bendihossan
1
"Waspadai kasus di mana Anda mendefinisikan metode yang sama di beberapa kelas; itu adalah kasus yang sangat baik di mana Anda dapat memfaktorkan metode tersebut ke dalam kelas dasar." Akankah memperluas Kelas memiliki keuntungan dibandingkan menggunakan Sifat untuk mendefinisikan metode tersebut?
Daniel Weiner
1
"Warisan berguna untuk mengurangi jumlah kode yang Anda tulis ulang" - Tujuan pewarisan adalah untuk berbagi perilaku, bukan kode. Jika memungkinkan, ciri adalah cara untuk berbagi kode daripada memperluas kelas abstrak dengan kelas konkret yang tidak memiliki kesamaan. Anda biasanya dapat membuat model kelas Anda sebagai hubungan has-a daripada is-a, juga, yang selanjutnya akan memfasilitasi penggunaan ulang kode dan polimorfisme.
Duncan
12

Melaksanakan:

Antarmuka adalah kelas abstrak, jadi Anda hanya dapat mendeklarasikan berbagai hal. Kelas A mengimplementasikan antarmuka. Anda dapat mengimplementasikan banyak antarmuka.

Memperpanjang:

Anda memperluas kelas ketika Anda menginginkan versi kelas yang lebih spesifik .

Contoh:

// Contract: a pet should play
public interface Pet {
    public void play(); 
}

// An animal eats and sleeps
class Animal {
    public void eat();
    public void sleep();
}


public class Camel extends Animal {

}

public class Dog extends Animal implements Pet {    
    public void play() {...}
}

Unta dan Anjing adalah hewan, jadi mereka memperluas Animalkelas. Tapi hanya anjing adalah jenis tertentu dari Animalyang juga bisa menjadiPet

Ahmad Mobaraki
sumber