Liskov İkame Prensibi arayüz uygulayan sınıflar için de geçerli mi?


17

LSP, sınıfların temel sınıfları için ikame edilmesi gerektiğini, yani türetilen ve taban sınıfların anlamsal olarak eşdeğer olması gerektiğini belirtir.

Peki LSP bir arayüz uygulayan sınıflar için de geçerli mi? Başka bir deyişle, bir sınıf tarafından uygulanan bir arabirim yöntemi , kullanıcının onun beklediğinden anlamsal olarak farklıysa, bu LSP'nin ihlali olarak kabul edilir mi?


7
Evet. Bir arayüz, soyut bir sınıf, tam bir sınıf ise LSP'yi ihlal etmekle aynı nedenler ve sonuçlar önemli değildir. LSP, tüketicilerin türlerinize genel bir şekilde davranmasını sağlamak için beklentileri belirlemek ve karşılamakla ilgilidir.
Jimmy Hoffa

5
Genel olarak (farklılıkları biliyorum, ama burada genelleme yapıyorum), arayüzler saf soyut sınıflara (C ++ terimi) biraz benziyor ve bu nedenle Liskov, arayüzlere ve bunları uygulayan sınıflara uygulanmalıdır.
Jesse C. Slicer

3
Not: Ben LSP formülasyonu türetilmiş ve temel sınıflar yerine alt tiplerden bahsederim. İyi bir sebeple, sanırım, çünkü nedenlerin hiçbiri mirasa özgü değildir ve diğer herhangi bir alt tip için de geçerlidir.

Yanıtlar:


17

bir sınıf tarafından uygulanan bir arabirim yöntemi , kullanıcının beklediğinden anlamsal olarak farklıysa, bu LSP'nin ihlali olarak kabul edilir mi?

Uygulama, arayüzün değişmezleri ve yöntemlerinin öncesi ve sonrası koşulları ile belgelenen davranıştan anlamsal olarak farklıysa, cevap "evet" dir, bu LSP'nin ihlali olacaktır. İlke, soyutlama tarafının bir sınıf biçiminde bulunmasını gerektirmeden, soyutlama ve uygulamaları için kuralları belirler.

Ancak, kullanıcıların ne beklediğinden bahsedersek , cevap "zorunlu olarak" olmaz: kullanıcılar yanlış beklentilere sahip olma hakkına sahiptir.


"Uygulama, arayüzün değişmezleri aracılığıyla belgelenen davranıştan anlamsal olarak farklıysa" Arayüz değişmezleri "ile ne demek istediğinizi açıklayabilir misiniz?
user1483278

3
@ user1483278 İşte tür değişmezleri hakkında bir makale . Makale onlara "Sınıf değişmezleri" diyor, ancak açıklama arayüzler için de geçerlidir. Değişmezler, inşaatta oluşturulan ve bir örneğin ömrü boyunca korunan koşullardır. Bir arabirim bir özelliğe sahiptir, örneğin, Nameayarlanabilir değil null, daha sonra obj.Name != null, bir olduğu söylenir değişmez bu arabirim.
dasblinkenlight

1
Tipik olarak değişmezler tartışıldığında, değişmezin nesnenin tüm ömrü boyunca desteklendiğini doğrulamak için bir kod parçası yazmak mümkündür. Bununla birlikte, değişmez olanı düz İngilizce olarak sözlü olarak tanımlamak genellikle daha kolaydır.
rwong
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.