07 мая 2012

#4 Про базовый класс и его наследников

... или «Блаженное неведение»


Всё просто: базовый класс НИЧЕГО не должен знать о своих наследниках. Это упростит создание новых или удаление имеющихся производных классов без лишних затрат труда и времени, тем более, иногда это невозможно, поскольку от этого класса могли наследоваться в коде, который вам недоступен. Этот термин получил название
   #блаженное неведение   
...


Иногда могут возникнуть случаи, когда необходимо записать в поток, а затем считать из него полную информацию об объекте, имея при этом доступ только к указателю или ссылке на базовый класс. Объекты производных классов могу хранить часть своих данных в той части объекта, которая относится к базовой, но, как уже говорилось раньше, базовый класс с этой информацией никак не должен взаимодействовать. Тем более, обрабатывать. В этих случая лучше вызывать виртуальные методы. Базовый класс должен определить так называемый контракт, интерфейс, который обязаны выполнить его открытые наследники. Такой подход позволяет производным классам действительно «являться» сущностью, коей является производный класс. Это позволит формировать алгоритмы, оперирующих только с интерфейсом базового класса и при этом правильно выполняющихся с любыми объектами производных классов.
Поэтому очень важно подойти к проектированию базового класса. Следует чётко, объектно-ориентированно определить чёткое понятие для базового класса, имя должно быть понятным и очевидным. Если есть проблема с именем класса или с набором его функционала, то следует его пересмотреть, возможно потребуется разбить его функционал на несколько классов, которые, не исключено, могут состоять в иерархии.
Следует учитывать все аспекты возможного дальнейшего наследования от проектируемого класса. Интерфейс класса должен помогать правильно его использовать и мешать использовать не правильно.