Главная » Java » Проектирование класса, подлежащего наследованию Java

0

 

Рассмотренный ранее класс Attr – это пример хорошего дизайна, выполненного в соответствии с принципами проектирования, о которых мы говорили в главе 2. Поля класса обозначены модификатором рrivate и доступ к ним осуществляется с помощью специальных методов класса, что препятствует возможности несанкционированного изменения содержимого полей, вступающей в противоречие с контрактом класса. Attr обладает Внятным и стройным интерфейсом и в то же время открыт для наследования и изменения реализации в угоду Конкретным потребностям.

Рассматривая класс ColorAttr, расширяющий Attr, мы можем задаться вопросом, а не стоило бы спроектировать Attr как-то иначе, чтобы его было удобнее наследовать? Целесообразно ли, например, Пометить поля name и vаlue модификатором protected вместо private, чтобы код производного класса мог обращаться к ним непосредственно? Подобные решения требуют серьезного размышления – следует принять во внимание все их возможные преимущества и недостатки. Обозначив поля класса Attr признаком protected, мы не получим какого-либо выигрыша с точки зрения производного класса, так как все необходимые операции над полями Могут быть выполнены посредством соответствующих методов public, предусмотренных в составе Attr. С другой стороны, модификатор protected "включит" ранее скрытые поля в контракт класса и в будущем воспрепятствует внесению любых изменений в реализацию Attr, поскольку существующие производные классы вправе воспользоваться предоставленным им шансом прямо го обрушения к полям protected. Таким образом, мы видим, что Attr в его теперешнем обличье вполне удовлетворяет текущим потребностям и допускает возможность наследования.

Создавая класс SingleListQueue, моделирующий структуру данных очереди посредством односвязного списка, мы пометили поля head и tail признаком protected. В данном случае, обеспечив производный класс средствами прямого доступа к элементам списка, мы получили ощутимые преимущества в виде прироста производительности – если бы единственными инструментами, доступными для использования, были методы add и remove, требующие дополнительных затрат на упаковку и распаковку элементов, нам пришлось бы еще более усугубить ситуацию, переопределяя эти методы в классе PriorityQueue. Назначение класса SingleListQueue, обусловленное природой рассматриваемой модели, Таково, что нам не следует особо погружаться в детали реализации, поскольку мы, прежде всего, имеем дело с проблемой отображения очереди с помощью односвязного списка, и проблема как таковая не дает большого простора для возможного развития класса в будущем. Случись нам создавать класс для представления очереди более общего характера, но в рамках все той же модели односвязного списка, это была бы уже совсем другая история.

:Класс, не обозначенный как final, обладает двумя интерфейсами. Интерфейс, определяемый совокупностью членов класса с признаком public, предназначен для программистов, которые захотят воспользоваться инструментами этого класса непосредственно. Члены, помеченные модификатором protected, образуют интерфейс, ориентированный на тех, кто изъявит желание заниматься наследованием класса. Модификатор protected не следует применять бездумно и невзначай: оба интерфейса есть контракты класса и к их разработке надо подходить в равной мере тщательно и ответственно.

 

Источник: Арнолд, Кен, Гослинг, Джеймс, Холмс, Дэвид. Язык программирования Java. 3-е изд .. : Пер. с англ. – М. : Издательский дом «Вильяме», 2001. – 624 с. : ил. – Парал. тит. англ.

По теме:

  • Комментарии