2011-11-17 42 views
5

理論上是健全覆蓋父方法在子類中與其中的參數在父類的參數的超類型,就像一個方法:是否存在具有繼承性的靜態類型編程語言,其中方法參數是逆變的?

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

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

哪些編程語言支持這個「功能」,以及如何做他們解決的問題,如的可能性,即一個子類的單個方法可以重寫父類的多種方法:(假設StringIntAny亞型)

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

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

+0

如果你談論的是靜態類型語言比我不知道。動態類型的語言不關心這個問題,所以我假設你正在談論靜態類型的語言。請在你的問題中註明。 –

+0

維基百科稱,一個名爲「Sather」語言有逆變(http://en.wikipedia.org/wiki/Covariance_and_contravariance_%28computer_science%29#Sather,http://en.wikipedia.org/wiki/Sather),但我不能保證其準確性。 –

+0

我不知道這樣的語言,但我認爲一個方法可以覆蓋超類的多個方法的事實沒有問題。當你執行'sInstance.foo(anyObject)'時,這個方法被調用。而不是'T.foo(String)'和'T.foo(Int)'。編譯器沒有問題。只是你,作爲一個程序員,有那麼這個調用是有道理 – piotrek

回答

0

雖然我把握的概念,我不知道我完全理解你的問題。也就是說,這聽起來像是你說派生類應該能夠實現使用派生'較少'參數的方法的重寫。這似乎倒退了。看起來重寫方法應該只能使用'更多'派生類型。也許這就是你的意思,也許我錯了這件事,但這裏是一個什麼樣的C#4.0允許報價:

(來自http://blogs.msdn.com/b/csharpfaq/archive/2010/02/16/covariance-and-contravariance-faq.aspx兩者)​​

什麼是方差泛型類型參數? 這是C#4.0中的一項新功能。現在,在創建通用接口時,可以指定是否存在具有不同類型參數的接口實例之間的隱式轉換。例如,您可以使用一個接口實例,該實例具有比最初指定的更多派生返回類型的方法(協方差)或具有派生參數類型較少的方法(逆變)。相同的規則適用於通用代理。

+1

「那向後我看來,」設計你的類 - 它不是,它是正確的。如果基類中的函數「foo」可以接受任何字符串,那麼覆蓋'foo' *必須作爲最小值接受任何字符串,否則它會中斷LSP。另外,什麼樣的逆向變化可以讓它接受其他的東西。採取超級類型的字符串呢,它允許字符串和其他東西。它的返回類型的協方差,它說,如果一個基類承諾返回一個字符串,然後派生類可以具體談談它返回什麼,只產生一定的子字符串類型的翻蓋側。 –

+0

啊,我看到我沒有正確閱讀自己的報價。我明白這正是它現在所說的。 –

2

(不完整的答案)如果我們把OCaml中的例子,它回答你的問題的標題:這是一個「靜態類型的編程語言,它繼承在其中方法參數是逆變」。

至於你的問題的第二部分(「他們是如何解決的問題一樣...」),快刀斬亂麻是不允許超載切割。 (重載意味着具有兩個具有相同名稱但參數類型不同的函數,這使得類型推斷困難得多)。