2014-06-23 157 views
5

從Java課程的PDF:http://www.ccs.neu.edu/home/riccardo/courses/csu370-fa07/lect4.pdf哪些語言「有繼承但沒有繼承」?

它說:

對於那些跟隨在家裏,我要強調,子類不繼承。我們將在課程的後面看到繼承。

當然,子類化和繼承是相關的。正如我們將看到的,繼承是一種代碼重用機制,可以讓您在定義子類時輕鬆地重用代碼。但是,即使沒有繼承,子類化也是有意義的。

(事實上,一些語言有子類,但沒有繼承,至少,像Java不是繼承實現。)

子類是類的屬性,是正確的Java類型系統的一部分。 Java使用子類來確定可以在對象上調用哪些方法,並在對象不提供給定方法時在編譯時返回錯誤。

我想知道哪些語言有繼承,但沒有繼承,至少,不像Java實現的繼承? (因爲我不太瞭解這些概念,所以如果我可以在某些實際語言中看到它,則會更清晰)

+0

我沒有看到這樣一種語言的觀點,但理論上這可能是可能的。我只能想象一些較低級(並且很少知道)的語言有這種行爲。 – gaborsch

+3

該課程的作者應該至少引用**一個**例子。不這樣做會導致括號失敗的鼬字測試。我從來沒有見過帶有繼承的*語言*,但沒有繼承。 *鍵入系統*,但不包括語言。例如,[COM](http://en.wikipedia.org/wiki/Component_Object_Model)具有子類化的概念,但是與語言無關,並不在COM本身直接支持繼承(我不認爲)。 –

+0

我想這也取決於你對「語言」的定義。在上面,我認爲「語言」=「編程語言」,但這個詞比這個更普遍。 「接口定義語言」例如經常稱自己爲「語言」,但僅僅關注指定接口;他們根本沒有實現(因此沒有繼承,只是繼承)。但HTML本身也稱爲「語言」,但顯然不是編程語言。 –

回答

3

這是一個沒有區別的區別。顯然他只是在他使用「繼承」這個詞時,纔會談論方法的繼承。他沒有使用由Wegner87引入的規範方式使用該術語,該術語與子類不可分割地交織在一起:

繼承:一個類可以繼承「超類」的操作,並且其操作可以由「子類」繼承。由「C new」操作創建的類C的一個對象具有C作爲其「基類」,並且可以使用在其基類中定義的操作以及在超類中定義的操作。

CS老師經常有奇怪的想法。這是其中之一。

+1

@downvoter沒有很好的拍攝使者。與[榮譽教授Peter Wegner](http://en.wikipedia。org/wiki/Peter_Wegner) – EJP

+0

我認爲問題不在於Wegner說什麼,而在於你如何應用它。你已經說過這是一個沒有區別的區別,但顯然有*區別,因爲我們的語言具有繼承性,但沒有子類化。例如,至少有一些原型語言。 (JavaScript可能是最着名的例子之一,我相信Self是第一個例子。)如果我們可以在沒有繼承的情況下進行繼承(根本沒有類),那麼顯然除了區分外,還有一個區別。 –

+0

但是,這確實是因爲OP的鏈接課程中的觀察質量很差。只是拋出一個沒有支持的評論就是很差的做法。 –