У меня есть два класса C ++: Sequence
, который похож на std::vector
, и File
, который представляет собой Sequence
строк, представляющих файл на компьютере.
Получение File
от Sequence
- это легко. Его поведение точно такое же, но с добавленной функциональностью чтения и записи файлов. Специфичные для File
функциональные возможности реализуются легко, без необходимости помечать элементы данных Sequence
как защищенные. Вместо этого они могут быть частными, и File
может использовать открытый интерфейс Sequence
. Счастливые времена вокруг.
Я хочу создать класс Array
, который внутренне управляет динамически выделяемой памятью. * Array
объект не может быть изменен; размер указан в конструкторе. *
Здесь все становится спорным.
Концептуально, имеет смысл вывести Sequence
из Array
. Так же, как File
- это Sequence
с добавленной функциональностью чтения и записи файлов, Sequence
- это Array
с дополнительной функциональностью изменения размера по требованию.
Но есть ключевое отличие: для функций изменения размера требуется прямой доступ к памяти Array
управляет. Другими словами, ранее закрытые члены теперь должны быть защищены.
Использование защищенных членов вместо личных разрушает инкапсуляцию. Связь между Array
и Sequence
является единственной, которая требует этого; другие классы в работах могут просто использовать общедоступные интерфейсы своих родителей. В этом смысле вывод плохой идеи.
Можно утверждать, что люди, которым нужны массивы, могут просто использовать Sequence
и игнорировать функцию изменения размера. Но опять же, вы можете просто использовать File
и игнорировать функции чтения / записи. Это все равно что покупать ноутбук, но никогда не сдвигать его со стола. Это просто не имеет смысла.
Какой лучший ход: извлекать и потенциально разрушать инкапсуляцию; сделать Array
полностью автономным классом и бессмысленно повторно реализовывать множество функциональных возможностей; или полностью забыть о Array
и просто заставить людей использовать Sequence
?
* Обратите внимание, что это проект для развлечения и обучения, поэтому практичность наличия динамически выделяемого массива с неизменяемым размером не имеет значения.