我有一個關于繼承定義的理論問題。一個月前我進行了一次測驗,我們不得不舉一個繼承的例子。
這是我的回答:
public interface UserRepository extends CrudRepository<User, Long>
根據定義,extend 關鍵字表示正在定義的類是使用繼承從基類派生的。但是,我的教授認為這個答案是錯誤的,因為我的示例是介面擴展,與繼承無關。
介面擴展和繼承有什么區別?為什么我的答案是錯誤的,我是否混淆了繼承的定義?
uj5u.com熱心網友回復:
好吧,Java 語言規范第 9.1.3 節提到了這一點:
如果
extends提供了子句,則宣告的介面擴展了每個指定的介面型別,因此繼承了每個介面型別的成員類、成員介面、實體方法和static欄位。
(強調我的。)
所以是的,我很確定這是繼承。
uj5u.com熱心網友回復:
詞是用來傳達意義的工具。如果我說“Student 介面繼承自 Person 介面”,那么我使用的詞是“好”,根據定義,如果聽到我的每個人都立即直覺我們有:
public interface Student extends Person {}
如果聽到我/閱讀我文字的部分或全部人不這樣做,那么這個詞的定義就很糟糕。
時期。
問題是,如果“受眾”很大并且不容易列舉怎么辦?如果我寫一篇博文或 SO 答案,將在未來 20 年內獲得數十萬瀏覽量怎么辦?今天很難問一個讀了 15 年答案的人是否真的正確理解了我想要表達的意思。
這是對正確使用術語的唯一抱怨。顯然,沒有任何法律規定稱這種“繼承”為非法。有 4 個有用的資源:
- 觀眾的知識,如果那是可知的。對于將在未來 20 年內閱讀的 SO 答案,這是不可知的。在教室里,它是。在開發團隊的對話中,肯定是這樣。
extends如果每個人出于某種原因將這種關鍵字的用法稱為“StudentixtendsPerson”(我捏造的),那么這就是要使用的詞。在這里教學的作用當然是教授最有可能向盡可能廣泛的受眾傳達你的意思的東西,所以這個來源基本上是無關緊要的。 - 官方定義。官方的,官方的。不是“我的老師是這樣說的”,也不是“這本教科書是這樣說的”。那本教科書只是由某人撰寫的,而不是由某種法官 陪審團 劊子手撰寫的。但是規格有一定的分量。那么讓我們來看看吧!
JLS §9.1.3:
如果提供了 extends 子句,則被宣告的介面擴展了其他每個命名介面,因此繼承了每個其他命名介面的成員型別、實體方法和常量。
非常接近:“繼承成員型別”,直接來自規范。我會說你的老師充滿了它,并且正在教他們的個人喜好作為唯一正確的答案。如果您愿意,請與他們對質,并確保列印出 §9.1.3 并展示給他們。
為了真正深入了解,這里是關于extendingclass定義的相關部分:JLS §8.1.4 - 這根本沒有提到“繼承”這個詞,所以按照規范你的老師是完全錯誤的。
常見的“俚語” - Jane Q. Average Coder 傾向于假設這個詞是什么意思?我相當肯定幾乎每個java程式員都會直覺“繼承”這個詞至少意味著
class X extends Y,并且至少會想:“......而且可能還有interface A extends B,甚至可能class X implements B。換句話說,通過這個定義,如果區分很重要,那么術語是無關緊要的——當你不是在說一般性但想具體傳達 A 和 B 是類而不是介面時說“A 繼承自 B”,那么這句話不適合目的- 它不會傳達這個想法。JLS、您的老師或任何手冊或書籍定義所說的并不重要。顯然,這并不能真正確定答案,盡管它強烈表明你是對的。為了“證明”它,我不知道,你必須去拿一個麥克風,在 Java 會議上走來走去,問問人們他們認為這意味著什么。某種普遍同意的事實來源。有幾本書如此受人尊敬,以至于普遍受到信任;換句話說,這是一本非常受信任的書,如果您說:“……并且 [這本神圣的書] 同意,請參閱 [此處的章節鏈接]”,您幾乎可以立即贏得任何爭論。在 java 中,這可能是Effective Java,但書籍很煩人,因為您無法以任何人都可以驗證的方式輕松鏈接到它們(他們必須先購買這本書)。我現在手頭沒有一本,但我非常懷疑它在這里有什么好處,它不是那種書。
……就是這樣。
這很復雜,但本質上,你的老師在這里是錯的。把這個標記下來是愚蠢的。給這位老師懷疑的好處,他們事先告訴你,這個練習涉及記住任意無意義的東西,你會根據你記住任意規則的能力來評分;考試和java關系不大,更像是記憶游戲,有java的概念。像這樣的教學有一些教學基礎,但是您可以進行這樣的測驗,而不必以如此過于精確的方式來解釋諸如“繼承”之類的模糊術語的含義,因此,盡管這會帶來懷疑的好處,這意味著降級是好的,但他們的教學方法很糟糕。
隨意向他們展示這個答案,如果他們想討論更好的觀點,他們可以發表評論。
uj5u.com熱心網友回復:
也許為了舉一個繼承的例子,我們應該指出CrudRepository被繼承的東西UserRepository。
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/430383.html
下一篇:VBA類繼承
