比方說,我有一個類,它實現了一個方法(addThings())。它作爲子類的樹的基礎:如何強制我的類的任何子類始終調用它們覆蓋的父級實現方法?
ParentClass {
protected void addThings() {
map.add(thing1);
map.add(thing2);
}
}
現在,讓我們說,我們實現一個子類(其中有事3爲好)和東西3還需要在事情1的頂部添加事情2。
顯而易見的Java解決方案似乎是有孩子的類的實現方法的調用超類的方法:
ChildClass extends ParentClass {
protected void addThings() {
super.addThings();
map.add(thing3);
}
}
的問題是,誰實現了子類很可能忘了做,有一個錯誤:
ChildClassBad extends ParentClass {
protected void addThings() {
// BUG!!! Forgot to call super.addThings(); !!!
map.add(thing3);
}
}
有沒有在Java中的方式來力任何延長孩子(以及孫子)的類始終調用AP arent的方法,如果他們重寫它? (類似於抽象方法總是迫使他們實現它)。
請注意,我需要解決方案沿着繼承樹進行傳播。
換句話說,如果有人實現了需要添加Thing4的GrandChildClass,他們將遭受相對於ChildClass相同的錯誤可能性。
這意味着在ParentClass中分別具有單獨的「addParentThings()」,然後同時調用addParentThings()和可覆蓋兒童的addThings()的簡單修復(適用於只有1級繼承)的情況下,不足(因爲孫子必須覆蓋非空的addThings)。
據我所知,你不能加強對超級方法的調用。你能給我們更多的細節,爲什麼你要使用這樣的機制?也許你有[XY-Problem](http://meta.stackexchange.com/questions/66377/what-is-the-xy-problem)? – Turing85
@ Turing85 - 我正在實施一個會在那裏待上一段時間的父類,很可能會被分類很多。我發現了一個明顯的**可能的錯誤,任何子類實現者都將受到影響,我想要一個基於Java編譯器的解決方案來解決這個問題(而不是「寫一條評論告訴人們這樣做,並希望他們閱讀評論「) – DVK
我得到你的一般想法,但我認爲你可以用另一種方式來防止這個問題。在給定的例子中,你可以通過構造函數強化你的條件,但我認爲你的情況並不那麼簡單。 – Turing85