虽然上面的示例可能表明出现了问题,但 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{...}
虽然让你的代码来定义你的所有合约是好的,因为它让你的编译器检查你是否违反了合约,但有时这是不合理的,你必须求助于弱定义的合约,比如注释。
简而言之,问题在于,如果您真的可以安全地将子类用作超类,考虑到超类是由其合同定义的,而不仅仅是代码。