簡體   English   中英

在不需要時使用超級有什么危害嗎?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM