Mengapa Anda membutuhkan antarmuka, jika sudah ada kelas abstrak?
Untuk mencegah multiple inheritance (dapat menyebabkan banyak masalah yang diketahui).
Salah satu masalah tersebut:
"Masalah intan" (kadang-kadang disebut sebagai "intan kematian yang mematikan") adalah ambiguitas yang muncul ketika dua kelas B dan C mewarisi dari A dan kelas D mewarisi dari kedua B dan C. Jika ada metode dalam A yang B dan C telah ditimpa, dan D tidak menimpanya, lalu versi mana dari metode yang D mewarisi: B, atau C?
Sumber: https://en.wikipedia.org/wiki/Multiple_inheritance#The_diamond_problem
Mengapa / Kapan menggunakan antarmuka?
Contoh ... Semua mobil di dunia memiliki antarmuka (metode) yang sama ... AccelerationPedalIsOnTheRight()
, BrakePedalISOnTheLeft()
. Bayangkan setiap merek mobil memiliki "metode" yang berbeda dari merek lain. BMW akan memiliki rem di sisi kanan, dan Honda akan memiliki rem di sisi kiri kemudi. Orang-orang harus belajar bagaimana "metode" ini bekerja setiap kali mereka akan membeli merek mobil yang berbeda. Karena itu, sebaiknya memiliki antarmuka yang sama di beberapa "tempat".
Apa yang dilakukan antarmuka untuk Anda (mengapa seseorang bahkan menggunakannya)? Antarmuka mencegah Anda membuat "kesalahan" (meyakinkan Anda bahwa semua kelas yang mengimplementasikan antarmuka tertentu, semua akan memiliki metode yang ada di antarmuka).
// Methods inside this interface must be implemented in all classes which implement this interface.
interface IPersonService
{
public function Create($personObject);
}
class MySqlPerson implements IPersonService
{
public function Create($personObject)
{
// Create a new person in MySql database.
}
}
class MongoPerson implements IPersonService
{
public function Create($personObject)
{
// Mongo database creates a new person differently then MySQL does. But the code outside of this method doesn't care how a person will be added to the database, all it has to know is that the method Create() has 1 parameter (the person object).
}
}
Dengan cara ini, Create()
metode akan selalu digunakan dengan cara yang sama. Tidak masalah jika kita menggunakan MySqlPerson
kelas atau MongoPerson
kelas. Cara kami menggunakan metode tetap sama (antarmuka tetap sama).
Sebagai contoh, ini akan digunakan seperti ini (di mana-mana dalam kode kami):
new MySqlPerson()->Create($personObject);
new MongoPerson()->Create($personObject);
Dengan cara ini, sesuatu seperti ini tidak dapat terjadi:
new MySqlPerson()->Create($personObject)
new MongoPerson()->Create($personsName, $personsAge);
Jauh lebih mudah untuk mengingat satu antarmuka dan menggunakan yang sama di mana-mana, daripada beberapa yang berbeda.
Dengan cara ini, bagian dalam Create()
metode dapat berbeda untuk kelas yang berbeda, tanpa memengaruhi kode "luar", yang memanggil metode ini. Yang perlu diketahui kode luar adalah bahwa metode tersebut Create()
memiliki 1 parameter ( $personObject
), karena itulah cara kode luar akan menggunakan / memanggil metode tersebut. Kode luar tidak peduli apa yang terjadi di dalam metode; hanya perlu tahu cara menggunakannya / menyebutnya.
Anda dapat melakukan ini tanpa antarmuka juga, tetapi jika Anda menggunakan antarmuka, itu "lebih aman" (karena mencegah Anda membuat kesalahan). Antarmuka meyakinkan Anda bahwa metode ini Create()
akan memiliki tanda tangan yang sama (tipe yang sama dan jumlah parameter yang sama) di semua kelas yang mengimplementasikan antarmuka. Dengan cara ini Anda dapat yakin bahwa kelas APAPUN yang mengimplementasikan IPersonService
antarmuka, akan memiliki metode Create()
(dalam contoh ini) dan hanya perlu 1 parameter ( $personObject
) untuk dipanggil / digunakan.
Kelas yang mengimplementasikan antarmuka harus mengimplementasikan semua metode, yang antarmuka / miliki.
Saya harap saya tidak mengulangi terlalu banyak.