雖然上面的例子可能表明出現了問題,但NotImplementedException本身始終沒有錯。這完全是關於超類的合同以及實施這個合同的子類。如果你的超類有這樣的方法
// This method is optional and may be not supported
// If not supported it should throw NotImplementedException
// To find out if it is supported or not, use isAddItemSupported()
public void AddItem(double a, int b){...}
然後,不支持這種方法仍然可以與合同。如果不支持,您可能應該禁用UI中的相應操作。所以如果你對這樣的合約可以,那麼子類就可以正確地實現它。
當客戶明確聲明,它不使用所有類的方法,並永遠不會另一種選擇。像這樣
// This method never modifies orders, it just iterates over
// them and gets elements by index.
// We decided to be not very bureaucratic and not define ReadonlyList interface,
// and this is closed-source 3rd party library so you can not modify it yourself.
// ha-ha-ha
public void saveOrders(List<Order> orders){...}
然後可以通過不支持添加,刪除和其他增變器的List實現。只需記錄它。
// Use with care - this implementation does not implement entire List contract
// It does not support methods that modify the content of the list.
public ReadonlyListImpl implements List{...}
雖然有你的代碼來定義所有的合同是好的,因爲它讓你的編譯器檢查,如果你違反了合同,有時是不合理的,你必須訴諸弱定義的合同,這樣的評論。
總而言之一句話說到這個問題,如果你真的可以放心地使用你的子類的父類,考慮到超類是由它的合同,不僅是代碼中定義。
我不知道NotImplementedException是否是一種代碼異味 - 異常表明它沒有實現_yet_。如果它是一個NotSupportedException,我同意。 – Lennaert 2009-04-09 06:59:42
同意。考慮到我的懶惰 - 我只是複製並粘貼了原來的問題。 – LeopardSkinPillBoxHat 2009-04-09 07:07:53
我修改了我對NotSupportedException的回答。 – LeopardSkinPillBoxHat 2009-04-09 07:21:57