上記の例はおそらく何かがうまくいかないことを示していますが、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{...}
コードですべてのコントラクトを定義するのは良いことですが、コントラクトに違反しているかどうかをコンパイラに確認させるため、合理的ではない場合があり、コメントのように定義の弱いコントラクトに頼らなければならないことがあります。
簡単に言えば、スーパークラスがコードだけではないコントラクトによって定義されていることを考慮して、サブクラスをスーパークラスとして本当に安全に使用できるかどうかという問題になります。