bir sublcass ebeveynin davranışını değiştirmemelidir?
Bu LSP'nin yaygın olarak yanlış yorumlanmasıdır. Bir alt sınıf, üst türe sadık kaldığı sürece üst öğenin davranışını değiştirebilir.
Wikipedia'da LSP'yi ihlal edecek şeyleri öneren iyi bir uzun açıklama var :
... alt türün karşılaması gereken bir takım davranış koşulları vardır. Bunlar, sözleşme yöntemiyle tasarıma benzeyen bir terminolojide ayrıntılı olarak anlatılmıştır ve sözleşmelerin mirasla nasıl etkileşime girebileceği konusunda bazı kısıtlamalara yol açmaktadır:
- Bir alt tipte önkoşullar güçlendirilemez.
- Alt koşullar bir alt türde zayıflatılamaz.
- Süpertipin değişmezleri bir alt tipte korunmalıdır.
- Geçmiş kısıtı ("geçmiş kuralı"). Nesneler yalnızca yöntemleri (kapsülleme) yoluyla değiştirilebilir olarak kabul edilir. Alt tipler, üst tipte bulunmayan yöntemler getirebileceğinden, bu yöntemlerin eklenmesi, alt tipte üst tipte izin verilmeyen durum değişikliklerine izin verebilir. Tarih kısıtı bunu yasaklar. Liskov ve Wing tarafından tanıtılan yeni elementti. Bu kısıtlamanın ihlali, bir MutablePoint'in bir ImmutablePoint'in alt türü olarak tanımlanmasıyla örneklenebilir. Bu, tarih kısıtlamasının ihlalidir, çünkü Değişmez noktanın tarihinde, devlet yaratıldıktan sonra her zaman aynıdır, bu nedenle genel olarak bir MutablePoint'in tarihini içeremez. Bununla birlikte, alt tipe eklenen alanlar, üst tip yöntemlerle gözlemlenemedikleri için güvenli bir şekilde değiştirilebilir.
Şahsen, bunu hatırlamak daha kolay buluyorum: A tipi bir yöntemde bir parametreye bakıyorsam, bir B alt tipini geçen birisi bana herhangi bir sürpriz yapar mı? Eğer yaparlarsa LSP ihlali olur.
İstisna atmak sürpriz midir? Pek sayılmaz. Bu, OrderState'de veya Grated veya Shipped'de Ship yöntemini çağırıyor olsam da, herhangi bir zamanda olabilecek bir şey. Bu yüzden bunu hesaba katmam gerekiyor ve bu aslında LSP'nin bir ihlali değil.
Bununla birlikte , bu durumu ele almanın daha iyi yolları olduğunu düşünüyorum. Bu C # yazıyor olsaydım, arabirimleri kullanmak ve yöntemi çağırmadan önce bir arabirimin uygulanmasını kontrol ediyorum. Örneğin, geçerli OrderState IShippable'ı uygulamıyorsa, üzerinde bir Ship yöntemi çağırmayın.
Fakat o zaman bu özel durum için Devlet modelini de kullanmam. Durum modeli, böyle bir etki alanı nesnesinin durumundan çok bir uygulamanın durumuna göre daha uygundur.
Yani, kısaca, bu Devlet Paterninin zayıf bir şekilde ele geçirilmiş bir örneğidir ve bir emrin durumunu ele almanın özellikle iyi bir yolu değildir. Ancak tartışmasız LSP'yi ihlal etmiyor. Ve Devlet modeli, kendi başına, kesinlikle değildir.