Надо понимать, что класс -- это не структура. Применительно к C++
мне больше нравится слово тип. Тип -- это сущность существующая
преимущественно в момент компиляции и обладающая некоторыми
свойствами, в машинном коде она превращается в функции и структуры
в конечном счёте, а то и вовсе ни во что не превращается, если все
вычисления проделаны при компиляции. Тип на самом деле это очень
легковесная конструкция. Это лишь абстракция служащая для
определения отношений между типами, для выбора используемых функций в зависимости от типа, ещё она может нести некий набор данных, или это может быть вообще лишь одна функция. И можно говорить, что на самом деле программирование отчасти имеет декларативный характер и ведётся в пространстве типов. В Java всё приходится делать классом и злоупотреблять наследованиями, т.к. там нет других механизмовс сделать то же, как например в C++ где есть шаблоны. Конечно шаблоны тоже оперируют над типами, но типом может оказаться и свободная функция, и в C++ есть argument dependent lookup и понятие friend функций объявленных в том же namespace. Те же функции сортировки могут быть просто свободными функциями. Могут быть функциональными классами. Могут быть функциями-членами классов над которыми они выполняют вычисления. Потом, возможно в данном примере не очень правильный "ООП-дизайн" и злоупотребление наследованиями идет от этого, возможно это Java-специфично (в C++ например возможно множественное наследование). Вообще технически наследование -- это наследование свойств типов (в compile time) и агрегация данных в рантайме. Если бы я делал, я бы постарался по возможности разбивать на плоскую структуру состоящую из множествя независимых типов, классов, функций. Без 7-и уровневой вложенности классов или наследований. И широко использовал бы возможность параметризации шаблонов классов или функций другими типами (классов или функций). Преимущество шаблонов как раз в том, что в них действует "утиная типизация", когда можно подсунуть что угодно обладающее нужными видимыми свойствами, без сложных иерархий наследования интерфейсов.