java расширяет или обертывает класс для добавления дополнительных функций
когда вы хотите добавить дополнительную информацию в класс, какой способ вы бы предпочли: вы расширили бы этот класс или сделали обертку вокруг него?
в моем конкретном сценарии я хочу добавить некоторую информацию о разбиении на страницы с помощью List
что я получаю из базы данных. Эта информация о разбиении на страницы будет включать:
int currentPage;
int totalResults;
int containedResultsIndex;
int totalcontainedResults;
и несколько методов:
Boolean isNextPageAvailable();
Boolean isPrevPageAvailable();
каково Ваше мнение, расширить или обернуть?
6 ответов
- в вашем случае оберните существующий
List
и сделайте свой класс implementList
сам, делегируя все методы исходному списку (который передается в конструкторе, например) - наследование не всегда неправильно, но в этом случае вы не будете знать, какой класс расширить - будет ли это
ArrayList
илиLinkedList
?
похоже, вы спрашиваете, следует ли вам отдавать предпочтение наследованию или композиции в вашей ситуации. Я бы сказал, что вы не создаете новую реализацию List
и вам все равно, как List
реализовано, поэтому наследование не соответствует вашей проблеме. Вместо этого вы предоставляете функциональность подкачки. Я бы создал класс, который в целом обертывает (инкапсулирует) логику подкачки, используя List
или какая-то другая общая коллекция.
слишком много расширяет зло, и сделает ваш код трудно читать/понимать идти с композицией, просто создать новый класс, который имеет коллекцию и дополнительные члены, необходимые для разбиения на страницы.
Я предпочитаю обернуть, где это возможно. Особенно в вашем List
пример - класс-оболочка может содержать любой тип списка, в то время как расширенный класс привязан к конкретному суперклассу.
даже если вы расширяете, вы не сможете вызвать новые методы через ссылку на супер класс. Лучше всего просто завернуть его.
наличие элегантного PagingList (расширение списка) является адекватным подходом.
зачем делегировать, когда вы можете наследовать то, что вам нужно?
Это похоже на отношения между FileReader и BufferedFileReader ( и никто не сказал бы, что это плохая практика).