(Это гипотетический вопрос для обсуждения, у меня нет реальной проблемы).
Скажем, что я делаю реализацию SortedSet
, расширяя LinkedHashMap
:
class LinkedHashSortedMapThing extends LinkedHashMap implements SortedSet {
...
}
Теперь программисты, которые используют этот класс, могут делать
LinkedHashMap x = new LinkedHashSortedMapThing();
Но что, если я считаю расширение LinkedHashMap
деталью реализации, и не хочу, чтобы оно было частью контракта класса?Если люди используют строку выше, я больше не могу свободно изменять эту деталь, не беспокоясь о нарушении существующего кода.Есть ли способ предотвратить подобные вещи, кроме предпочтения композиции перед наследованием (что не всегда возможно из-за частных / защищенных членов)?