[英]Is there any harm in failing to close a file when a Java program terminates?
[英]Is there any harm in using super when not needed?
此消息嚴格適用於Java。 如果方法在超類中,則可以通過兩種方式調用該方法:
foo();
super.foo();
總是做后者有什么害處嗎? 作為一種編碼風格,我更喜歡后者,因為一眼就能看出方法調用的來源。 在任何情況下,“超級”將不存在或不做我認為會做的事情嗎?
我認為你可能遇到的唯一傷害是當你想使用多態時,如果你調用foo()
並且某些子類重寫foo,那么效果會比你調用super.foo()
有所不同,基本上,它取決於你是如何設計代碼以及用於何種目的的。
希望這說清楚。
作為一般規則,您應該只在類foo()
方法中使用super.foo()
。 總的來說,不這樣做違背了OOP的思想。
因為一眼就可以看出方法調用的來源
在OOP中,您不應該知道方法調用“來自”的位置。 如果您的程序(或您的想法)依賴於此,您可能會遇到麻煩(當有人決定覆蓋該方法時,可能會遇到實際問題)。 myobject.foo()
方法必須從外部看作myobject類的方法; 如果該方法實際上在其父級的具體類中實現,則無關緊要。
我會說做前者有更多的危害,因為它不是一個超類的方法。
是的,這基本上打破了繼承鏈。
您不允許繼承機制選擇即使在從此派生的類中使用的函數。
super.foo()
是允許您僅在需要時指定,並且您知道其他任何行為都不會很好。
如果您不想明確避免在子類中使用重寫方法,那么您不應該使用super。 如果以后某人想要覆蓋子類中的方法,那么總是使用super可能會造成麻煩。
如果您打算在超類上調用該方法,而不是在沒有super.
情況下調用foo()
,那么這是一種更好的方法super.
。 如果有人在子類中覆蓋foo()
,則超級調用會調用與之前相同的方法,但是省略super
將現在調用覆蓋的方法。 這取決於您對該方法調用的意圖。
這取決於。
如果foo()
被聲明為final
,那么它將沒有任何區別。 如果foo()
未聲明為final
,則子類可以覆蓋超類中foo()
的聲明,並完全更改預期的行為。
如果您將自己的類設為final
,則可以防止它被分類,並確保保留原始意圖。
我會說這可能表明你應該再考慮一下你的設計。
如果你總是通過super.foo()來調用這個功能,那么你可以阻止自己以后覆蓋這個函數,如果你不想重寫函數,那么也許你不應該使用繼承作為方法用於訪問此功能。
我聽說過的一個設計原則是“贊成組合而不是繼承”,其原因是你的代碼變得更靈活,而不是繼承。 如果你沒有獲得繼承的積極方面(能夠覆蓋函數),那么可能不使用繼承更明智。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.