Есть много способов, как изменение базового класса может повлиять на поведение производного класса.Что, если автор вдруг решил сделать класс sealed
, например?
Как и любой интерфейс, он должен быть стабильным, если потребителям не требуется модификация.
Основное "правило" снаследование - это принцип Лисковской субстанции.Это говорит о том, что производный класс должен заменять базовый класс или другие производные от него классы.
Этот случай нарушает это правило, так как прямоугольник с отверстием не является прямоугольником.
Обычно лучше использовать интерфейсы для разделения поведения на разумные реализуемые куски.Такие интерфейсы обычно называют прилагательными, а не существительными.Например, имеет смысл отображать как прямоугольник, так и прямоугольник с отверстием, поэтому интерфейс может иметь значение IRenderable
.Если его можно изменить, у вас может быть IResizable
и т. Д. Они могут быть объединены в IShape
, но вы должны быть осторожны, чтобы ваше определение Shape определяло только поведение в вашей проблемной области.
Непосредственнонаследование от другого класса может быть опасным, так как тогда вы будете связаны поведением этого класса.Если вам действительно нужно это сделать, лучше всего извлечь нужную реализацию в общий базовый класс (например, Rectangle : RectangleImplementation, IShape
).