Dalam upaya saya untuk menulis kode yang lebih baik dan lebih bersih, saya belajar tentang prinsip-prinsip SOLID. Dalam hal ini, LSP terbukti sedikit sulit untuk dipahami dengan baik.
Keraguan saya adalah bagaimana jika saya memiliki beberapa metode tambahan dalam subtipe saya, S, yang tidak ada dalam tipe, T, apakah ini akan selalu menjadi pelanggaran terhadap LSP? Jika ya, lalu bagaimana extend
saya kelas saya?
Misalnya, katakanlah kita memiliki Bird
tipe. Dan subtipe-nya adalah Eagle
dan Humming Bird
. Sekarang kedua subtipe memiliki beberapa perilaku umum sebagai Bird
. Tetapi Eagle
juga memiliki perilaku predator yang baik (yang tidak ada pada Bird
tipe umum ), yang ingin saya gunakan . Karenanya, sekarang saya tidak akan bisa melakukan ini:
Bird bird = new Eagle();
Jadi apakah memberi Eagle
perilaku ekstra itu melanggar LSP?
Jika ya, maka itu berarti saya tidak dapat memperpanjang kelas saya karena itu akan menyebabkan pelanggaran LSP?
class Eagle extends Bird {
//we are extending Bird since Eagle has some extra behavior also
}
Perluasan kelas harus diizinkan sesuai dengan prinsip Terbuka / Tertutup bukan?
Terima kasih sebelumnya telah menjawab! Seperti yang Anda lihat dengan jelas, LSP membuat saya bingung seperti apa pun.
Sunting: Lihat jawaban SO ini. Dalam hal ini lagi, ketika Car
memiliki perilaku tambahan seperti ChangeGear
, itu melanggar LSP. Jadi, lalu bagaimana kita memperluas kelas, tanpa melanggar LSP?
sumber
Jawaban:
Jawaban yang sangat sederhana: tidak.
Poin ke LSP adalah yang
S
harus digantiT
. Jadi jikaT
mengimplementasikan suatudelete
fungsi,S
harus mengimplementasikannya juga dan harus melakukan delete ketika dipanggil. Namun,S
bebas untuk menambahkan fungsionalitas tambahan di atas yangT
disediakan. Konsumen dariT
, ketika diberiS
akan tidak menyadari fungsionalitas tambahan ini, tetapi diizinkan untuk digunakan oleh konsumenS
secara langsung.Contoh yang sangat dibuat-buat tentang bagaimana prinsip tersebut dapat dilanggar adalah:
Jawaban yang sedikit lebih rumit: tidak, asalkan Anda tidak mulai mempengaruhi status atau perilaku yang diharapkan lainnya dari tipe dasar.
Misalnya, berikut ini akan menjadi pelanggaran:
Jenis,
Point2D
, adalah kekal; keadaannya tidak bisa diubah. DenganMyPoint2D
, saya sengaja menghindari perilaku itu untuk membuatnya bisa berubah. Itu melanggar batasan sejarahPoint2D
dan merupakan pelanggaran terhadap LSP.sumber
delete
fungsi yang akan menjadi pelanggaran LSP?Tentu saja tidak. Jika objek Eagle dapat digunakan oleh kode apa pun yang mengharapkan Bird atau subclass, dan berperilaku sebagai Bird harus berperilaku, Anda baik-baik saja.
Tentu saja perilaku Elang hanya dapat digunakan oleh kode yang sadar bahwa itu adalah objek seperti itu. Kami berharap bahwa beberapa kode akan secara eksplisit membuat objek Eagle dan menggunakannya sebagai objek Eagle, sambil dapat menggunakan kode apa pun yang mengharapkan objek Bird.
sumber