2011-11-17 15 views
5

Teorik olarak parametreler gibi, üst sınıfta parametrelerin supertypes olan bir yöntem ile bir alt sınıfta bir ebeveyn yöntemlerini geçersiz kılmak için ses: programlama dilleri bu nasıl "özelliğini" ve destekleyenYöntem parametrelerinin kontravaryant olduğu, statik olarak yazılmış programlama dilleri miras ile mi var?

class T 
    def foo(s: String) = ... 

class S 
    override def foo(a: Any) = ... 

onlar bir alt sınıfın tek yöntem bir üst sınıfın birden yöntemlerini geçersiz kılabilir ihtimaline gibi sorunları çözmek mi: (. Any ait String olduğunu ve Int alt tipi varsayarsak)

class T 
    def foo(s: String) = ... 
    def foo(i: Int) = ... 

class S 
    override def foo(a: Any) = ... 

+0

Bildiğimden, statik olarak yazılan dillerden bahsediyorsanız. Dinamik olarak yazılan diller bu konuda değil, statik olarak yazılan diller hakkında konuştuğunuzu varsayar. Lütfen sorunuzda dikkat edin. –

+0

WIkipedia, "Sather" adında bir dilin contravariance (http://en.wikipedia.org/wiki/Covariance_and_contravariance_%28computer_science%29#Sather, http://en.wikipedia.org/wiki/Sather) olduğunu iddia eder ancak doğruluğu için kefil olamaz. –

+0

Ben böyle bir dil bilmiyorum ama bir yöntem süper sınıftan birden çok yöntemi geçersiz kılabilir aslında bir sorun görmüyorum. sInstance.foo (anyObject) 'yi kullandığınızda bu yöntem denir. T.foo (String) 've' T.foo (Int) 'değil. Derleyici için sorun yok. sadece siz, bir programcı olarak, sınıflarınızı tasarlamanız gerekiyor bu yüzden bu çağrışım mantıklı geliyor – piotrek

cevap

0

Kavramları anladığım halde, sorunuzu tam olarak anladığımı bilmiyorum. Yani, türetilmiş sınıfların 'daha az' türetilmiş olan parametreleri kullanan yöntemlerin geçersiz kılmalarını gerçekleştirebildiğini söylediniz gibi geliyor. Bu bana geri görünüyor. Öyle görünüyor ki, geçersiz kılma yöntemi yalnızca daha fazla türetilmiş türler kullanabilmelidir. Belki de bu kastediyordum, ya da belki bu konuda yanlış ama burda için izin verdiklerini C# 4.0 arasında bir alıntı:

(http://blogs.msdn.com/b/csharpfaq/archive/2010/02/16/covariance-and-contravariance-faq.aspx Alındığı)

genel tür parametreleri için varyans nedir? Bu C# 4.0'da yeni bir özelliktir. Şimdi, genel bir arayüz oluştururken, farklı türde argümanlara sahip arayüz örnekleri arasında örtük bir dönüşüm olup olmadığını belirtebilirsiniz. Örneğin, özgün olarak belirtilen (kovaryans) veya daha az türetilmiş parametre türlerine (contravariance) sahip yöntemleri olan daha türetilmiş dönüş türlerine sahip yöntemleri olan bir arabirim örneği kullanabilirsiniz. Aynı kurallar genel delegelere uygulanır.

+1

"Bana geriye doğru görünüyor" - bu doğru değil. Temel sınıftaki foo işlevi herhangi bir String'i kabul ederse, foo'nun * geçersiz olması asgari olarak herhangi bir String'i kabul etmelidir, aksi takdirde LSP'yi bozar. Ne kontravaryans yaparsa, başka şeyleri kabul etmesine de izin verir. Süper tip bir String kullanmak bunu yapar, String ve diğer şeylere izin verir. Bu, bir temel sınıf bir String döndürmeyi vaat ederse, türetilmiş bir sınıfın ne döndüğüne dair daha spesifik olabileceğini ve yalnızca belirli String alt türlerini üretebileceğini söyleyen, dönüş tipi kovaryansın ters yüzüydü. –

+0

Ah, kendi teklifimi doğru okuduğumu anlamadım. Görüyorum ki şimdi tam olarak ne diyor. –

2

(Tamamlanmamış yanıt) Eğer OCaml örneğini alırsak, sorunuzun başlığını yanıtlar: bu, "yöntem parametrelerinin kontravaryant olduğu, kalıtsal olarak yazılmış bir programlama dili" dir.

Sorunuzun ikinci kısmına gelince ("sorunları nasıl çözer?"), Gordian düğümü aşırı yüklemeye izin vermeyerek kesilir. (Aşırı yükleme, aynı adı taşıyan ancak farklı bağımsız değişken türlerine sahip iki işlevi vardır, bu da tür çıkarımını çok daha zor hale getirir).

İlgili konular