2012-07-21 58 views
3

免責聲明:這不是關於理解abstract class es和interface s之間的區別的問題。如果您沒有得到,請再次閱讀標題。我對合同和半實施子系統)。爲什麼在語法層面上區分接口類和抽象類?

讓我們以Java爲例。似乎幾乎不需要一個獨特的關鍵字interface,從我作爲開發人員的角度來看,編譯器吐出了完全相同的東西,這在人們的說法中是:「直到你得出爲止,才能使用它(通過implementsextends)實施其方法的新類「。簡單。

但是有一種情況可能會阻止這兩種情況的混淆:當我們需要implement多於一個interface時,由於Java不允許多重繼承(對於class es)。當然,以這樣的方式構建語言會很簡單:編譯器能夠識別何時存在任何方法體或聲明的變量,並且隨後在適當的情況下不允許使用多種方法或變量。順序的優先順序是否存在問題?

這是我們有這種句法分化的唯一原因嗎?

P.S.我問這個問題的一個原因是,這種情況在理解新的OO程序員方面可能會帶來相當大的挑戰,我認爲在語言層面上以更簡化的方式處理這個問題將大大有助於更快地理解概念差異。

+2

您認爲「編譯器能夠識別何時存在任何方法體或聲明的變量,並且在適當的情況下不允許多實現/擴展」會比要求明確聲明該差異更容易理解嗎? (我真的沒有。) – Mat 2012-07-21 15:32:45

+0

@Mat我明白你的觀點,但我絕對認爲它可以,如果以正確的方式處理。其他人則可以自由地提出這種風格。 – 2012-07-21 15:34:14

+0

也許它可能會,也許不會,但事實並非如此。除非你問吉姆戈斯林,否則你不是問問題的原因。一個反對的觀點是,改變之前沒有實現的東西會讓他們失去所有現有的擴展/實現類,現在只能在運行時檢測到,除非它們被重新編譯:這不是一個有吸引力的選擇。無論這是戈斯林的理由,還是唯一的原因,都是人們的猜測。 – EJP 2012-07-29 07:03:37

回答

2

當然,編譯器能夠識別何時存在任何方法體或聲明的變量,並隨後在適當情況下不允許使用多實現/擴展時構建語言會很微不足道?

假設你確實這樣做了。所以,你的語言讓你這樣做:

class Foo extends A, B, C { 
} 

而且它不會在B只要抱怨,因爲每個方法和C是抽象的。精緻和華麗。

現在讓我們假設您沒有創建B。這是其他人寫的其他軟件包。他們不知道你的班級Foo。當他們做出B時,其中的一切都是抽象的,但這只是一個巧合:他們沒有碰到任何具體的東西。

後來,他們決定在B中增加另一種方法,其中具體。現在,沒有意識到,他們已經破壞了你的班級Foo

構建一個明確的interface結構的一個論據是,它使B的作者的意圖清楚地被消費者所使用。

一般來說,我認爲你的問題是一個很好的問題。我所使用的語言Dart實際上與您所談論的內容非常接近:它現在有一個明確的interface語法,但是它被刪除以支持純粹的抽象類。

+1

最後一個明智的答案。感謝你的分享。 – 2012-08-01 13:11:20

+0

即使A,B或C都沒有包含任何會阻止它成爲接口的東西,那麼父類型'Foo'應該是什麼。那麼父類型的Bar擴展A,Foo,C,B'如何? – supercat 2013-12-30 19:59:04

+0

如果A,B和C都是完全抽象的,假設的語言可以使用A或Object作爲一個具體的超類。要麼工作。 – munificent 2013-12-30 23:34:31